欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF 通过线程使用ProcessBar

程序员文章站 2022-07-11 08:50:47
WPF下使用进度条也是非常方便的,如果直接采用循环然后给ProcessBar赋值,理论上是没有问题的,不过这样会卡主主UI线程,我们看到的效果等全部都结束循环后才出现最后的值。 所以需要采用线程或者后台方式给进度条赋值的方式,以下通过线程来触发事件触发的方式来实现给进度条赋值。这样就可以模拟我们在实 ......

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

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

 1 using system;
 2 using system.collections.generic;
 3 using system.linq;
 4 using system.text;
 5 using system.threading;
 6 using system.threading.tasks;
 7 using system.windows;
 8 using system.windows.controls;
 9 using system.windows.data;
10 using system.windows.documents;
11 using system.windows.input;
12 using system.windows.media;
13 using system.windows.media.imaging;
14 using system.windows.navigation;
15 using system.windows.shapes;
16 
17 namespace wpftestprocessbar
18 {
19     /// <summary>
20     /// mainwindow.xaml 的交互逻辑
21     /// </summary>
22     public partial class mainwindow : window
23     {
24         public delegate void progressdelegate(int percent);
25         public mainwindow()
26         {
27             initializecomponent();
28             progressevent += mainwindow_progressevent;
29             beginimport();
30         }
31         void mainwindow_progressevent(int percent)
32         {
33             dispatcher.invoke(new action<system.windows.dependencyproperty, object>(pro.setvalue), system.windows.threading.dispatcherpriority.background, new object[] { progressbar.valueproperty, convert.todouble(percent+ 1) });
34             dispatcher.invoke(new action<system.windows.dependencyproperty, object>(label.setvalue), system.windows.threading.dispatcherpriority.background, new object[] { label.contentproperty, convert.tostring((percent + 1)+"%") }); 
35 
36         }
37         private event progressdelegate progressevent;
38         private void beginimport()
39         {
40             pro.maximum = 100;
41             pro.value = 0;
42             label.content = "0%";
43             threadpool.queueuserworkitem(state =>
44             {
45                 thread.sleep(2000);
46                 for (int i = 0; i < 100; i++)
47                 {
48                     if (progressevent != null)
49                     {
50                         progressevent(i);
51                     }
52                     thread.sleep(10);
53                 }
54             });
55         }
56     }
57 }

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

效果如下:

WPF 通过线程使用ProcessBar