我无法让我的进度条工作。非常感谢任何帮助!
以下是代码:
<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();
}
}
答案 0 :(得分:3)
要添加Mark所说的内容,有两种方法可以解决问题。黑客的方式和正确的方式。
正确的方法是使用线程,例如BackgroundWorker。您最终可能会使用control.BeginInvoke来处理更新GUI线程。
黑客方法是在循环中调用Application.DoEvents。我称之为黑客,因为它只是部分有效。例如,如果你正在进行一个有很多快速指令的紧密循环,那么它将很好地工作。如果你正在做一个循环,你的指令需要一段时间,这将无法工作(例如对数据库进行大量的SQL查询)。
Here是了解这个特定示例的好链接。我认为WPF只处理与常规WinForms略有不同的东西。
答案 1 :(得分:1)
这个答案并非针对C#或WPF,而是针对Windows。只有在处理Windows消息时,才会更新进度条。如果您在没有UI交互的情况下运行紧凑的CPU循环,则进度条永远不会重新绘制。
答案 2 :(得分:1)
我不确定这是你的问题(我对动画知之甚少......我只是通过增加“价值”属性来使用进度条),但我认为这里的大部分建议都是忽略WPF中引入的UI线程模型:Threading in WPF
如果你有某种循环(我不认为你这样做,从你的代码判断,但我可能是错的),那么你会想要用Dispatcher计划循环的每次迭代......通过这种方式,WPF可以将执行的代码与正确重新绘制所需的UI事件进行散布。
希望这有帮助。
答案 3 :(得分:1)
我发现了两件事:
答案 4 :(得分:0)
我假设你问一个基本问题,即使用后面的代码使进度条工作?我猜,线程不是你的问题。 在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