wpf通过线程使用processbar(代码片段)

hglsv hglsv     2023-03-13     672

关键词:

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插拔触摸设备触摸失效(代码片段)

...使用WPF程序,在不停插拔触摸设备会让WPF程序触摸失效。通过分析WPF源代码可以找到WPF触摸失效的原因。在Windows会将所有的Hid(输入)设备在插拔的时候通过Windows消息进行更新设备信息。在触摸的时候,通过一个线程用来收集... 查看详情

2019-6-15-wpf-触摸到事件(代码片段)

...Thread(newThreadStart(this.ThreadProc)) IsBackground=true .Start();通过这个方法就可以创建线程运行ThreadProc这个函数是一个无限循环,请看代码while(!this.__disposed) //忽略代码这个函数的底层 查看详情

wpf触摸到事件(代码片段)

...Thread(newThreadStart(this.ThreadProc)) IsBackground=true .Start();通过这个方法就可以创建线程运行ThreadProc这个函数是一个无限循环,请看代码while(!this.__disposed) //忽略代码这个函数的底层实际上是包括了另一个循环来从penimc2_v0400.dll拿... 查看详情

wpf之调用线程必须为sta,因为许多ui组件都需要(代码片段)

...UI线程,后台代码不能直接操作UI控件,需要控制,就要通过这个Dispatcher。  参考链接:https://www.cnblogs.com/xinaixia/p/5706096.html 查看详情

wpf一个空的wpf程序有多少个窗口(代码片段)

...的5个窗口之MediaContextNotificationWindow听说有五个窗口可以通过user32的EnumThreadWindows找到一个线程的窗口delegateboolEnumThreadDelegate(In 查看详情

wpf通过名称查找属性(dependencyproperty)(代码片段)

...名称来查找DependencyProperty。如果有这样的需求,则是需要通过DependencyPropertyDescriptor来查找。通常是使用附加属性或者依赖属性的方法。下面给出附加属性的例子:  这个是注册附加属性,利用string来输入要查找的属性publi... 查看详情

2019-11-29-wpf-从触摸消息转触摸事件(代码片段)

...摸失效,如果此时还可以收到系统的触摸消息,那么可以通过从触摸消息转触摸事件解决程序触摸失效但不适合所有触摸失效程序在WPF的触摸代码写的不是很清真,特别是触摸到事件可能出现一些坑,如WPF在触摸线程等待主线程... 查看详情

wpf通过名称查找属性(dependencyproperty)(代码片段)

原文:WPF通过名称查找属性(DependencyProperty)使用名称来查找DependencyProperty。如果有这样的需求,则是需要通过DependencyPropertyDescriptor来查找。通常是使用附加属性或者依赖属性的方法。下面给出附加属性的例子:  这个是... 查看详情

jgui源码:实现简单进度条(19)(代码片段)

...种方法,先实现代码,后续进行控件封装<style>.jgui-processbar.loadingbackground-color:#22B581;height:100%;width:0%;color:white;text-align:center;</style></head><body><div>这是进度条演示代码</div><scripttype="text/javascript">$(functi... 查看详情

wpf通过位处理合并图片(代码片段)

原文:WPF通过位处理合并图片本文告诉大家,在使用WPF合并两张图片的处理,可以使用像素之间的与或和异或的方式,对三个颜色的通道进行处理。先给大家看一下软件的界面这就是通过将左边的两张图片叠加合并为一张图片,... 查看详情

wpf通过附加属性控制窗口关闭(代码片段)

场景1当使用ShowDialog()方式显示窗口时,通过定义附加属性的方式可实现在ViewModel中进行数据绑定(bool?)来控制子窗口的显示和关闭publicclassExWindowpublicstaticbool?GetDialogResult(DependencyObjectobj)return(bool?)obj.GetValue(DialogResultProperty);p 查看详情

wpf中窗口控件的跨线程调用(代码片段)

原文:WPF中窗口控件的跨线程调用在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls=false;即可。在WPF中要麻烦一下,同样的不允许跨线程访问,因为没有权限,访问了会抛异常;没有CheckForIllegalCross... 查看详情

wpf通过附加属性控制窗口关闭(代码片段)

原文:WPF通过附加属性控制窗口关闭场景1当使用ShowDialog()方式显示窗口时,通过定义附加属性的方式可实现在ViewModel中进行数据绑定(bool?)来控制子窗口的显示和关闭publicclassExWindowpublicstaticbool?GetDialogResult(DependencyObjectobj)return(bool?... 查看详情

wpf支持的多线程ui并不是线程安全的(代码片段)

原文:WPF支持的多线程UI并不是线程安全的WPF支持创建多个UI线程,跨窗口的或者窗口内的都是可以的;但是这个过程并不是线程安全的。你有极低的概率会遇到WPF多线程UI的线程安全问题,说直接点就是崩溃。本文将讲述其线程... 查看详情

wpf制作windows屏保(代码片段)

...isualStudio2019;项目使用MIT开源许可协议;更多效果可以通过GitHub[1]|码云[2]下载代码;也可以自行添加天气信息等 查看详情

wpf动画(代码片段)

原文:WPF动画1、基本动画。WPF提供了一个更高级的模型,通过该模型可以只关注动画的定义,而不考虑它们的渲染方式,这个模型基于依赖项属性基础架构,本质上,WPF动画只不过是在一段时间间隔内修改依赖项属性值的一种方... 查看详情

wpf多线程进度条更新进度(代码片段)

主要的使用类:DispatcherusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;us... 查看详情

windows消息循环-wpf中的消息循环(代码片段)

...Window中),使用this.Dispatchcer获取到Dispatchcer。一般我们会通过三种方式获取Dispatchcer://App.Current.Dispatcher;(Application.Current.Dispatcher)vardispatcher1=App.Current.Dispatcher;//CurrentDispatcher;vardispatcher2=System.Windows.Threading.Dispatche 查看详情