何时启动WPF进度条

时间:2012-08-09 03:03:53

标签: wpf visual-studio-2010 c#-4.0

我希望我的应用在执行某些组件检查时显示正在运行的进度条。但是,由于我对桌面应用程序编程和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()方法?

1 个答案:

答案 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;
}