2014-01-14 90 views
0

我有一個工作人員和一個進度條。進度條在View中,工作人員在模型中。 我想向用戶顯示進度條,以便他們知道他們需要等待多長時間。爲所有結果完成填充。進度條不會完成

工作線程看起來像這樣

型號

ManagementObjectSearcher MetaClasses = new ManagementObjectSearcher(CurrentScope, new SelectQuery("SELECT * FROM meta_class")); 
int index = 0; 
int Total = MetaClasses.Get().Count; 
foreach (ManagementObject Metaclass in MetaClasses.Get()) 
{ 
    try 
    { 
     index++; 
     BGW.ReportProgress((index * 100)/Total, Metaclass["__CLASS"].ToString()); 
    } 
    catch { } 
    Thread.Sleep(100); 
} 

工人將信息發送到ProgressUpdated方法,我這樣做,以便與最終用戶的菱數據更新UI。

模型

public void Workers_Changed(object sender, ProgressChangedEventArgs e) 
{ 
    Progress = e.ProgressPercentage; 
    switch (TaskToRun) 
    { 
     case "NameSpace": 
      { 
       BaseClasses.Add(e.UserState.ToString()); 
       if (Progress == 100) { Thread.Sleep(200); } 
       break; 
      } 
     case "Class": 
      { 
       return; 
      } 
    } 
} 

再次完美。 我的進度欄值也受到約束。

XAML

<ProgressBar Height="20" Name="ProgressBar_WMI" 
      Value="{Binding Progress,Mode=OneWay}" 
      DockPanel.Dock="Top" 
      Minimum="1" 
      Maximum="100" Foreground="Red" ValueChanged="ProgressBar_WMI_ValueChanged" /> 

問題:當命中進度約95%爲在UI線程

視圖(Xaml.CS)

public void HideProgressBar() 
{ 
    Thread.Sleep(3000); 
    ProgressBar_WMI.Visibility = Visibility.Collapsed; 
} 

public void ProgressBar_WMI_ValueChanged(object sender, RoutedEventArgs e) 
{ 
    if (ProgressBar_WMI.Value == ProgressBar_WMI.Maximum) 
    { 
     ProgressBar_WMI.Foreground = Brushes.Green; 
     HideProgressBar(); 
    } 
    else { 
     ProgressBar_WMI.Foreground = Brushes.Red; 
     ProgressBar_WMI.Visibility = Visibility.Visible; 
    } 
} 
完成它不顯示

我的想法是讓酒吧打到100%完成並變成綠色,表示已完成並在3秒後消失/崩潰。

任何想法的?

+0

使用Dispatcher.BeginInvoke異步調用HideProgressBar。這將使窗口有機會重繪自己,以便在進度條以菲拉狀態繪製時執行'Thread.Sleep(3000)'。 'Dispatcher.BeginInvoke(新的行動(()=> HideProgressBar()));' –

+0

林假設你在談論使用分派在公共無效ProgressBar_WMI_ValueChanged(對象發件人,RoutedEventArgs E)的方法,我已經更新了代碼,並仍我遇到問題。 –

回答

0

我可以看到您的ProgressBar未達到100%的兩個可能的原因。第一個原因很簡單,因爲你可能會在它達到那一點時就隱藏它,所以,你永遠不會實際上看到它。

其他可能的原因是,這個計算從未達到你的最大極限值:

BGW.ReportProgress((index * 100)/Total, Metaclass["__CLASS"].ToString()); 

只有你可以驗證這一點,但你可能由會失去一些精度在實際計算使用int s here ... I am知道ReportProgress方法需要int

+0

if(ProgressBar_WMI.Value == ProgressBar_WMI.Maximum),有助於不執行所述操作,直到達到最大值。使用斷點顯示值=最大值。 –