博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF刷新界面之坎坷路
阅读量:6681 次
发布时间:2019-06-25

本文共 3186 字,大约阅读时间需要 10 分钟。

   项目需要一个硬件检测功能,需要用到界面刷新,刚开始想用个定时器,对检测过的硬设定时添加后刷新界面。

但是很遗憾,定时器并不能进行刷新。后台检测List数据里面已经添加了很多了很多数据了,就是不能显示到界面

然后百度一下“WPF刷新界面”找了好几篇文章,大致都是如下代码:

public class UIHelper : Application    {        //刷新界面        private static DispatcherOperationCallback             exitFrameCallback = new DispatcherOperationCallback(ExitFrame);        public static void DoEvents()        {            DispatcherFrame nestedFrame = new DispatcherFrame();            DispatcherOperation exitOperation =                Dispatcher.CurrentDispatcher.BeginInvoke(                DispatcherPriority.Background,                exitFrameCallback, nestedFrame);            Dispatcher.PushFrame(nestedFrame);            if (exitOperation.Status != DispatcherOperationStatus.Completed)            {                exitOperation.Abort();            }        }        private static object ExitFrame(object state)        {            DispatcherFrame frame = state as DispatcherFrame;            frame.Continue = false;            return null;        }    }

我把代码手敲下来,(注意不是复制,应为我不是太懂,这里也劝大家不要轻易复制,因为复制就算解决问题

了下次你还是不知道怎么回事)。在我添加数据后面调用UIHelper .DoEvents(),但是还是没有反应。依然不

刷新,我就郁闷了,别人可以解决为啥到我这就不能用了呢,请教各位大神,这个怎么用啊?有什么前提条件

吗?请我告诉我……

然后继续找啊找啊,在CSDN上找到了类似的问题。原来list<T>没有数据更新的功能,这里面需要用

  或 代替 List 类,看ObservableCollection<T>在帮助文档里的说明,

这个提供自动更新数据的接口,可以自动向控件发送更新消息,果断一实验。OK成功显示。

public partial class Window2 : Window    {        DispatcherTimer _mainTimer;        public Window2()        {            InitializeComponent();            _mainTimer = new DispatcherTimer();            _mainTimer.Interval = TimeSpan.FromSeconds(1);            _mainTimer.Tick += new EventHandler(_mainTimer_Tick);            _mainTimer.IsEnabled = true;        }        void _mainTimer_Tick(object sender, EventArgs e)        {            if (progressBar1.Value == progressBar1.Maximum)                progressBar1.Value = 0;            progressBar1.Value++;            DeviceCheckInfo device = new DeviceCheckInfo();            device.CheckResult = true;            device.Name = "发卡器" + progressBar1.Value;            device.CheckContent = "打卡短短";            Dispatcher.BeginInvoke(new Action(() => {                if (list != null)                    list.Add(device);                lbtest.ItemsSource = list;                // UIHelper.DoEvents();                   }));                       }        ObservableCollection
list; private void Window_Loaded(object sender, RoutedEventArgs e) { list = new ObservableCollection
(){ new DeviceCheckInfo {Name="三合一读卡器",CheckContent="duankou",CheckResult=true }, new DeviceCheckInfo {Name="发卡器",CheckContent="tongdao",CheckResult=false }, new DeviceCheckInfo {Name="打印机",CheckContent="youzhi" ,CheckResult=true} }; lbtest.ItemsSource = list; } private void button1_Click(object sender, RoutedEventArgs e) { DeviceCheckInfo device = new DeviceCheckInfo(); device.CheckResult = true; device.Name = "发卡器" + progressBar1.Value; device.CheckContent = "打卡短短"; list.Add(device); lbtest.ItemsSource = list; } } 效果如下:

转载地址:http://gfnao.baihongyu.com/

你可能感兴趣的文章
MVC5 + EF6 + Bootstrap3 (16) 客户端验证
查看>>
Centos上安装nodejs
查看>>
Tree Context Menu
查看>>
存储过程中执行动态Sql语句
查看>>
《Java并发编程实战》第十三章 显示锁 读书笔记
查看>>
Eclipse工具使用技巧总结
查看>>
MQTT的学习研究(十六) MQTT的Mosquitto的window安装部署
查看>>
Hash算法
查看>>
下载文档--Struts2中国的文件下载被显示为空间的问题
查看>>
[LeetCode] ZigZag Conversion [9]
查看>>
WCF - Self Hosting
查看>>
从头开始建网站(三)DNS
查看>>
有人写了编程建议
查看>>
The Toast in android
查看>>
C#学习笔记(十二):正则表达式
查看>>
Simplified CommonJS wrapper 与 AMD 标准定义模块差异
查看>>
MyBatis有关resultType和resultMap差异
查看>>
猜数字(规律)
查看>>
“脑子快”的程序员更优秀吗?
查看>>
使用脚本实现killproc的功能
查看>>