2014-09-12 22 views
0

我剛剛開始使用WPF,並試圖實現一個ProgressBar,但無法讓它做我想做的事情。如何在WPF中設置ProgessBar的可見性?

我只想讓UI在任務發生時顯示進度條,但不應該顯示其他情況。

這是我必須在XAML:

<ProgressBar x:Name="pbarTesting" HorizontalAlignment="Left" Height="37" 
    Margin="384,301,0,0" VerticalAlignment="Top" Width="264" IsHitTestVisible="True" 
    IsIndeterminate="True" Visibility="Collapsed"/> 

和應用程序我寫道:

progressBar.Visibility = Visibility.Visible; 
doTimeConsumingStuff(); 
progressBar.Visibility = Visibility.Hidden; 

然而,當我到了耗時的東西,進度條一直沒有出現。誰能告訴我我做錯了什麼?

+0

調查Backgroundworker ReportsProgress。 – Paparazzi 2014-09-12 18:59:40

回答

4

WPF從只有一個稱爲UI線程的線程開始。 UI不會更新除UI線程以外的其他UI。當我們在UI線程中進行長時間運行的操作時;更新UI暫停。所以,當我們需要在長時間運行的操作中更新UI時,我們可以在UI線程之外的其他線程中啓動長時間運行的操作。

在以下示例中,我在背景線程中啓動了長時間運行的操作。當操作完成後,它會返回一個值,然後我將它用在UI線程中。

private void MethodThatWillCallComObject() 
     { 
      System.Threading.Tasks.Task.Factory.StartNew(() => 
      { 
       //this will call in background thread 
       return this.MethodThatTakesTimeToReturn(); 
      }).ContinueWith(t => 
      { 
       //t.Result is the return value and MessageBox will show in ui thread 
       MessageBox.Show(t.Result); 
      }, System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext()); 
     } 

     private string MethodThatTakesTimeToReturn() 
     { 
      System.Threading.Thread.Sleep(5000); 
      return "end of 5 seconds"; 
     } 
+1

如果這對你沒有幫助;在這裏添加你的代碼。 – zaman 2014-09-12 19:13:19

+0

謝謝!我知道我可能需要另一個線程(雖然我沒有在問題中提到過),因爲我之前已經完成了一些Android編程,並瞭解了UI線程和其他線程之間的分離,但我無法確定瞭解如何實現這一點。它工作完美。 – AdamMc331 2014-09-12 19:13:50

2

doTimeConsumingStuff正在鎖定UI線程,因此可見性從未有機會生效。

您需要將該操作放在單獨的Thread上,並使用某種回調或事件來隱藏進度條。

1

嘗試增加這些方法的MainWindow類:

private void hideProgressBar () 
    { 
     this.Dispatcher.Invoke ((Action) (() => { 
      progressBar.Visibility = Visibility.Hidden; 
     })); 
    } 
    private void showProgressBar () 
    { 
     this.Dispatcher.Invoke ((Action) (() => { 
      progressBar.Visibility = Visibility.Visible; 
     })); 
    } 

updateProgress (int progress)方法都是相似的。如果調用進度欄更新的線程位於不同的類中,請使用方法public

相關問題