[英]Why won't my progress bar work?
我无法让进度条正常工作。 任何帮助深表感谢!
这是代码:
<Window x:Class="BulkSAConfigureControl.BulkSaProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Please Wait.." Height="60" Width="300" WindowStyle="ToolWindow" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
<ProgressBar Name="progressBar" IsIndeterminate="True">
<ProgressBar.Resources>
<ResourceDictionary Source="/PresentationFramework.Aero;v3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml" />
</ProgressBar.Resources>
</ProgressBar>
。
public class ProgressBarClass : Window
{
public ProgressBarClass()
{
InitializeComponent();
}
public void StartProgressBar()
{
Duration d = new Duration(TimeSpan.FromSeconds(5));
DoubleAnimation anim = new DoubleAnimation(100.0, d);
progressBar.BeginAnimation(ProgressBar.ValueProperty, anim);
this.Show();
}
public void StopProgressBar()
{
this.Close();
}
}
。
public class DoSomething : UserControl
{
public void DoSomeStuff()
{
ProgressBarClass pBar = new ProgressBarClass();
pBar.StartProgressBar();
// Do some stuff here
pBar.StopProgressBar();
}
}
要添加Mark所说的话,有两种方法可以解决此问题。 破解方法和正确方法。
正确的方法是使用线程,例如BackgroundWorker。 您可能最终将使用control.BeginInvoke来处理GUI线程的更新。
破解方法是在循环中调用Application.DoEvents。 我称其为hack,因为它只能部分起作用。 例如,如果您执行的是一个紧密循环,其中包含很多快速说明,那么它将正常工作。 如果执行的循环中您的指令需要一段时间,则此操作将不起作用(例如对数据库进行大型sql查询)。
这是学习此特定示例的一个很好的链接。 我认为WPF处理的东西与常规WinForms略有不同。
这个答案并非特定于C#或WPF,而是针对Windows。 仅当您正在处理Windows消息时,进度条才会更新。 如果您正在运行紧密的CPU循环而没有UI交互,则进度条将永远没有机会重绘。
我不确定这是否是您的问题(我对动画了解不多...我只是通过增加“ Value”属性来使用进度条),但是我认为这里的大多数建议都忽略了用户界面WPF中引入的线程模型:WPF中的线程
如果您有某种循环(根据代码判断,我认为您没有,但是我可能是错的),那么您将需要使用Dispatcher调度循环的每次迭代...这样WPF可以散布您的代码,并执行需要正确重绘的UI事件。
希望这可以帮助。
我观察到两件事:
我假设您在问一个基本问题,就是要使用后面的代码来制作进度条? 我猜线程不是您的问题。 在WPF中,使进度条起作用非常简单。 希望您会有一些来自后台流程的值(以百分比表示)。 只需设置ProgressBar.Value属性,其余的事情就可以完成。 下面的测试应用
<ProgressBar x:Name="progress" MouseDown="Window_MouseDown" VerticalAlignment="Top" Height="93"/>
在C#
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
progress.Value = progress.Value+1;
}
并在后面的代码中编写以下代码,并在应用运行时继续单击ProgressBar
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.