2013-03-12 142 views
0

我將WPF ProgressBar的「不確定」設置爲「真」和「隱藏的可見性」。在事件處理程序中,我試圖在ObservableCollection正在更新(以及ListSource的ItemsSource爲ObservableCollection)時使ProgressBar可見。我希望DoEvents()從System.Windows.Forms.Application可以使它可見,但它不。 我注意到SetPBarHelper(() => { ..})通常比ListView顯示的視覺變化早得多。WPF進度條未顯示

如何使ProgressBar在事件處理程序代碼中可見?

如何判斷我的ListView是否仍在更新中,即使ObserableCollection已完成添加項目?

<ProgressBar x:Name="GeneralProgressBar" Width="300" Height="15" IsIndeterminate="True" Visibility="Hidden"/> 

private void SetPBar(bool isVisible) 
{ 
    if (isVisible) 
     GeneralProgressBar.Visibility = System.Windows.Visibility.Visible; 
    else 
     GeneralProgressBar.Visibility = System.Windows.Visibility.Hidden; 
} 

private void SetPBarHelper(Action handler) 
{ 
    SetPBar(true);    // try to make ProgressBar visible 
    System.Windows.Forms.Application.DoEvents(); 
    handler();     // use the event handling, which run database query 
    SetPBar(false);    // try to make ProgressBar disappear 
} 


private void CommandForumImagesBinding_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    SetPBarHelper(() => 
    { 
     if (e.Parameter == null) 
      return; 
     var vm = e.Parameter as ForumViewModel; 
     if (vm != null) 
     { 

     } 
    }); 
} 

public sealed class ImageGroupCollection : ObservableCollection<ImageGroup> 
{ 
    public ImageGroupCollection() : base() { } 

    public void Update(DateTime start, DateTime end) 
    { 
     ClearItems(); 
     var list = MyDatabase.GetRecords(start, end); 
     if (list != null) 
     { 
      foreach (var g in list) 
      { 
       Add(g); 
      } 
     } 
    } 
} 
+0

你爲什麼使用System.Windows.Forms.Application.DoEvents()?這不是一個WinForm的東西嗎? – Aron 2013-03-12 06:54:07

+0

你看過'BackgroundWorker'嗎?如果你把handler()放在BackgroundWorker中,它應該讓你在查詢運行時看到進度條。 – Eirik 2013-03-12 08:21:32

回答

2

你的問題只是因爲你阻塞了UI線程。你不能那樣做。

當UI線程再次運行消息循環時,您已設置ProgressBar.Visible = falseProgressBar從不繪製。

假設您正在使用.net 4.5您需要按如下方式重寫代碼。

private async Task SetPBarHelper(Action handler) 
{ 
    SetPBar(true);    // try to make ProgressBar visible 
    System.Windows.Forms.Application.DoEvents(); 
    await Task.Run(handler);     // use the event handling, which run database query 
    SetPBar(false);    // try to make ProgressBar disappear 
} 

但總體來說,你需要儘快返回UI線程的控制權返回給應用程序循環,以允許它重繪窗口,並運行在的WorkerThread更新。

+0

這應該是'等待Task.Run(處理程序);' – Blachshma 2013-03-12 07:03:21

+0

@Blachshma真的。 – Aron 2013-03-12 08:46:21