【问题标题】:Progress Bar will not complete进度条不会完成
【发布时间】:2014-01-14 09:49:50
【问题描述】:

我有一个工人和一个进度条。进度条在视图中,工作人员在模型中。 我想向用户显示进度条,以便他们知道需要等待多长时间。以完成所有结果的填充。

工作线程是这样的

型号

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。这将使窗口有机会重绘自身,以便在进度条在filal状态下绘制时执行Thread.Sleep(3000)Dispatcher.BeginInvoke(new Action(() =&gt; HideProgressBar()));
  • 我假设您谈论的是在公共 void ProgressBar_WMI_ValueChanged(object sender, RoutedEventArgs e) 方法中使用 Dispatcher,我已经更新了代码,但仍然遇到问题。

标签: c# wpf multithreading


【解决方案1】:

我可以看到您的ProgressBar 未达到 100% 的两个可能原因。第一个原因很简单,因为您可能会在它到达那个点时立即隐藏它,因此您永远不会实际上看到它。

另一个可能的原因是这个计算从来没有达到你的最大限制值:

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

只有您可以验证这一点,但您可能在此处使用ints 可能会在实际计算中失去一些精度...我am知道@ 987654324@ 方法采用int

【讨论】:

  • if (ProgressBar_WMI.Value == ProgressBar_WMI.Maximum),表示在达到最大值之前不执行所述动作。使用断点表明该值 = 最大值。
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
相关资源
最近更新 更多