我希望我的应用在执行某些组件检查时显示正在运行的进度条。但是,由于我对桌面应用程序编程和WPF缺乏了解,我找不到适合它的地方。
我试图在Window_Loaded()
,ContentRendered()
期间显示增加进度条,但没有运气。
而不是显示progressBar增加,它只显示进度条的最终状态。
这是代码
public partial class Loading : Window
{
public Loading()
{
InitializeComponent();
SetProgressBar();
this.Show();
CheckComponents();
}
private void CheckComponents()
{
System.Threading.Thread.Sleep(3000);
CheckProductionDBConnection();
pgrsBar.Value = 30;
System.Threading.Thread.Sleep(3000);
CheckInternalDBConnection();
pgrsBar.Value = 60;
System.Threading.Thread.Sleep(3000);
CheckProductionPlanning();
pgrsBar.Value = 90;
//MainWindow mainWindow = new MainWindow();
//mainWindow.Show();
}
private void SetProgressBar()
{
pgrsBar.Minimum = 0;
pgrsBar.Maximum = 100;
pgrsBar.Value = 0;
}
//more code down here...
我应该在哪里放置CheckComponents()
方法?
答案 0 :(得分:1)
您可以将此代码放在订阅Activated
事件的事件处理程序中。这样做的一个问题是每次窗口在丢失之后获得焦点时都会触发Activated
事件。要解决这个问题,您可以在事件处理程序中执行的第一件事是取消订阅Activated
事件,以便仅在第一次激活窗口时执行代码。
如果您不希望延迟阻止主线程,还需要将此工作卸载到工作线程。如果你这样做,你将不得不调用你的电话来更新progess bar的值。
以下是一些示例代码,可帮助您入门:
public Loader()
{
InitializeComponent();
SetProgressBar();
this.Activated += OnActivatedFirstTime;
}
private void OnActivatedFirstTime(object sender, EventArgs e)
{
this.Activated -= this.OnActivatedFirstTime;
ThreadPool.QueueUserWorkItem(x =>
{
System.Threading.Thread.Sleep(3000);
CheckProductionDBConnection();
this.Dispatcher.BeginInvoke(new Action(() => pgrsBar.Value = 30));
System.Threading.Thread.Sleep(3000);
CheckInternalDBConnection();
this.Dispatcher.BeginInvoke(new Action(() => pgrsBar.Value = 60));
System.Threading.Thread.Sleep(3000);
CheckProductionPlanning();
this.Dispatcher.BeginInvoke(new Action(() => pgrsBar.Value = 90));
});
}
private void SetProgressBar()
{
pgrsBar.Minimum = 0;
pgrsBar.Maximum = 100;
pgrsBar.Value = 0;
}