我有一個工作人員和一個進度條。進度條在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秒後消失/崩潰。
任何想法的?
使用Dispatcher.BeginInvoke異步調用HideProgressBar。這將使窗口有機會重繪自己,以便在進度條以菲拉狀態繪製時執行'Thread.Sleep(3000)'。 'Dispatcher.BeginInvoke(新的行動(()=> HideProgressBar()));' –
林假設你在談論使用分派在公共無效ProgressBar_WMI_ValueChanged(對象發件人,RoutedEventArgs E)的方法,我已經更新了代碼,並仍我遇到問題。 –