我有一个工人和一个进度条。进度条位于视图中,工作者位于模型中。 我想向用户显示进度条,以便他们知道他们需要等待多长时间。所有结果都可以完成填充。
工作线程看起来像这样
模型
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 :(得分:0)
我可以看到ProgressBar
未达到100%的两个可能原因。第一个原因很简单,因为你可能会在它到达那一点时隐藏它,所以,你永远不会实际看到它。
其他可能的原因是此计算从不达到最大限制值:
BGW.ReportProgress((index * 100) / Total, Metaclass["__CLASS"].ToString());
只有您可以验证,但可能在实际计算中失去一些精确度,方法是使用int
s ...我我意识到ReportProgress
方法需要int