2012-08-09 84 views
0

我希望我的應用程序在執行某些組件檢查時顯示正在運行的進度條。但是,由於我在桌面應用程序編程和WPF方面的知識不足,我無法找到合適的位置。何時啓動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

您可以將此代碼放入訂閱Activated事件的事件處理程序中。有一個問題是,每當窗口失去焦點後,它就會觸發Activated事件。爲了解決這個問題,你可以在事件處理程序中做的第一件事是取消訂閱Activated事件,這樣只有在第一次激活窗口時才能執行你的代碼。

如果您不想延遲阻塞主線程,則還需要將此工作卸載到工作線程。如果你這樣做,你將不得不調用你的電話來更新Progess欄的價值。

下面是一些示例代碼,您開始:

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; 
} 
+0

聽起來並不像我想像的那樣簡單。感謝壽。我只注意到WPF與正常的窗體非常不同。 – 2012-08-09 03:13:46

+0

只是好奇又是什麼?這叫什麼? 'this.Dispatcher.BeginInvoke(new Action(()=> pgrsBar.Value = 90)); '這是lambda嗎? – 2012-08-09 03:28:58

+0

This Works!只需將'CheckProductionDBConnection();'更改爲this.Dispatcher.BeginInvoke(new Action(()=> CheckProductionDBConnection()));'以避免線程擁有錯誤。其他檢查功能也一樣。再次感謝! – 2012-08-09 03:47:44