0

我希望我的应用程序在进行一些组件检查时显示正在运行的进度条。但是,由于我缺乏桌面应用程序编程和 WPF 方面的知识,我找不到合适的地方。

我试图在 期间显示递增的进度条Window_Loaded()ContentRendered()但没有运气。

而不是显示progressBar 增加,它只显示progress Bar 的最终状态。

这是代码

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()方法放在哪里?

4

1 回答 1

1

您可以将此代码放在订阅该Activated事件的事件处理程序中。与此有关的一个问题是,Activated每次窗口在失去焦点后获得焦点时都会触发该事件。为了解决这个问题,您可以在事件处理程序中做的第一件事是取消订阅Activated事件,以便您的代码仅在第一次激活窗口时执行。

如果您不希望延迟阻塞主线程,您还需要将此工作卸载到工作线程。如果你这样做,你将不得不调用你的调用来更新进度条的值。

这里有一些示例代码可以帮助您入门:

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;
}
于 2012-08-09T03:08:41.470 回答