如何通过WPF线程操作实现ProcessBar的长时间运行与动态更新?

2026-04-18 22:433阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计512个文字,预计阅读时间需要3分钟。

如何通过WPF线程操作实现ProcessBar的长时间运行与动态更新?

前言:在WPF下使用进度条是非常方便的,但如果直接采用循环给ProcessBar赋值,理论上是没有问题的,但这样会阻塞UI线程,导致用户界面无法响应。我们观察到,只有当循环结束后,才会出现最终的值。

前言

WPF下使用进度条也是非常方便的,如果直接采用循环然后给ProcessBar赋值,理论上是没有问题的,不过这样会卡主主UI线程,我们看到的效果等全部都结束循环后才出现最后的值。

所以需要采用线程或者后台方式给进度条赋值的方式,以下通过线程来触发事件触发的方式来实现给进度条赋值。这样就可以模拟我们在实际过程中处理数据的一种进度方式。

方法示例:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfTestProcessBar { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public delegate void ProgressDelegate(int percent); public MainWindow() { InitializeComponent(); ProgressEvent += MainWindow_ProgressEvent; beginImport(); } void MainWindow_ProgressEvent(int percent) { Dispatcher.Invoke(new Action<System.Windows.DependencyProperty, object>(Pro.SetValue), System.Windows.Threading.DispatcherPriority.Background, new object[] { ProgressBar.ValueProperty, Convert.ToDouble(percent+ 1) }); Dispatcher.Invoke(new Action<System.Windows.DependencyProperty, object>(label.SetValue), System.Windows.Threading.DispatcherPriority.Background, new object[] { Label.ContentProperty, Convert.ToString((percent + 1)+"%") }); } private event ProgressDelegate ProgressEvent; private void beginImport() { Pro.Maximum = 100; Pro.Value = 0; label.Content = "0%"; ThreadPool.QueueUserWorkItem(state => { Thread.Sleep(2000); for (int i = 0; i < 100; i++) { if (ProgressEvent != null) { ProgressEvent(i); } Thread.Sleep(10); } }); } } }

以上只是一种实现方式,希望给有需要的人提供帮助。

效果如下:

总结

如何通过WPF线程操作实现ProcessBar的长时间运行与动态更新?

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对易盾网络的支持。

标签:方法

本文共计512个文字,预计阅读时间需要3分钟。

如何通过WPF线程操作实现ProcessBar的长时间运行与动态更新?

前言:在WPF下使用进度条是非常方便的,但如果直接采用循环给ProcessBar赋值,理论上是没有问题的,但这样会阻塞UI线程,导致用户界面无法响应。我们观察到,只有当循环结束后,才会出现最终的值。

前言

WPF下使用进度条也是非常方便的,如果直接采用循环然后给ProcessBar赋值,理论上是没有问题的,不过这样会卡主主UI线程,我们看到的效果等全部都结束循环后才出现最后的值。

所以需要采用线程或者后台方式给进度条赋值的方式,以下通过线程来触发事件触发的方式来实现给进度条赋值。这样就可以模拟我们在实际过程中处理数据的一种进度方式。

方法示例:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfTestProcessBar { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public delegate void ProgressDelegate(int percent); public MainWindow() { InitializeComponent(); ProgressEvent += MainWindow_ProgressEvent; beginImport(); } void MainWindow_ProgressEvent(int percent) { Dispatcher.Invoke(new Action<System.Windows.DependencyProperty, object>(Pro.SetValue), System.Windows.Threading.DispatcherPriority.Background, new object[] { ProgressBar.ValueProperty, Convert.ToDouble(percent+ 1) }); Dispatcher.Invoke(new Action<System.Windows.DependencyProperty, object>(label.SetValue), System.Windows.Threading.DispatcherPriority.Background, new object[] { Label.ContentProperty, Convert.ToString((percent + 1)+"%") }); } private event ProgressDelegate ProgressEvent; private void beginImport() { Pro.Maximum = 100; Pro.Value = 0; label.Content = "0%"; ThreadPool.QueueUserWorkItem(state => { Thread.Sleep(2000); for (int i = 0; i < 100; i++) { if (ProgressEvent != null) { ProgressEvent(i); } Thread.Sleep(10); } }); } } }

以上只是一种实现方式,希望给有需要的人提供帮助。

效果如下:

总结

如何通过WPF线程操作实现ProcessBar的长时间运行与动态更新?

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对易盾网络的支持。

标签:方法