WPF刷新界面之坎坷路

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

但是很遗憾,定时器并不能进行刷新。后台检测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>没有数据更新的功能,这里面需要用

ObservableCollection<T> 类 或 BindingList<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<DeviceCheckInfo> list;
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            list = new ObservableCollection<DeviceCheckInfo>(){
                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;
        }

    }

效果如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

excel导入与导出

基本上导出的文件分为两种: 1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已。修改这种文件后再保存...

2766
来自专栏FreeBuf

远程RPC溢出EXP编写实战之MS06-040

0x01 前言 MS06-040算是个比较老的洞了,在当年影响十分之广,基本上Microsoft大部分操作系统都受到了影响,威力不亚于17年爆出的”永恒之蓝”漏...

25710
来自专栏高性能服务器开发

windows完成端口(六)

系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) ...

3164
来自专栏Golang语言社区

写在学习golang一个月后

连接池。由于PHP没有连接池,当高并发时就会有大量的数据库连接直接冲击到MySQL上,最终导致数据库挂掉。虽然Swoole有连接池,但是Swoole只是PHP的...

2152
来自专栏圣杰的专栏

Asp.net mvc 知多少(十)

本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想...

19710
来自专栏安恒网络空间安全讲武堂

[HCTF] share write up

从http://share.2018.hctf.io/robots.txt中获取到题目部分源码

802
来自专栏一只程序汪的自我修养

手把手教你用.NET Core写爬虫

自从上一个项目58HouseSearch从.NET迁移到.NET core之后,磕磕碰碰磨蹭了一个月才正式上线到新版本。

29412
来自专栏禹都一只猫博客

Linux 性能检测常用的 10 个基本命令

1202
来自专栏nummy

Tornado入门(七)【认证和安全】

Cookies信息通常不安全,很容易被篡改。如果需要通过cookies来区分不同的登录用户,则需要对cookies进行签名,以防伪造。Tornado通过set_...

922
来自专栏坚毅的PHP

tornado cherrypy bottle性能测试

2011-11-25 今天做了个tornado cherrypy 和 bottle的对比 ab -n 10000 -c 1000 http://192.1...

3596

扫码关注云+社区