【问题标题】:WPF Update progress bar on dialog form对话框窗体上的 WPF 更新进度条
【发布时间】:2017-01-11 12:14:44
【问题描述】:

我在一个表单上有一个 ProgressBar,我想在父表单执行长时间操作时将其显示为对话框。

ProgressWindow 很简单:

构造函数接受最大值,我有一个增量方法。

public ProgressWindow(int count)
{
    InitializeComponent();
    fileProgressBar.Maximum = count;
}

public void IncremntProgress()
{
    fileProgressBar.Value++;
}

在父节点上创建一个实例:

ProgressWindow progressWindow = new ProgressWindow(listOfFiles.Count);
progressWindow.Show();

然后我运行一个大型操作,我想更新进度条:

foreach (var file in listOfFiles)
{
    ....
    progressWindow.IncremntProgress();
}

progressWindow.Close();

这可行,但我希望表单是一个对话框,并且进度条不能正确刷新。

有没有更好的方法来更新对话框窗口上的进度条?

【问题讨论】:

  • 您在 XAML 上是否有 ProgressBaran 最小值和最大值? <ProgressBar Minimum="0" Maximum="100" Name="fileProgressBar" />
  • 如果您在 UI 线程中运行大型操作,那么在 foreach 的整个持续时间内,您不会让 UI 绘制/更新任何内容。三种方法:1)将操作移动到单独的线程并调用(最佳)2)使用在另一个线程中创建的窗口显示进度(如果您必须对 UI 调用太多更改可能会很好)3)在循环内定期调用Application.DoEvents() (不推荐)。
  • 是的,我已经设置了最小值和最大值

标签: c# wpf dialog progress-bar


【解决方案1】:

目前尚不清楚“未正确刷新”的实际含义,但您应该在后台线程上运行“大型操作”并在 UI 线程上更新包括 ProgressBar 在内的所有 UI 元素:

Task.Run(() =>
{
    //...
    foreach (var file in listOfFiles)
    {
        //...
        progressWindow.Dispatcher.Invoke(new Action(()=> progressWindow.IncremntProgress()));
    }
}).ContinueWith(task => 
{
    progressWindow.Close();
}, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());

UI 线程不能同时更新 ProgressBar 和运行您的操作/循环。

【讨论】:

  • 这很好,但是有没有使progressWindow Modal?
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多