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 条评论
登录 后参与评论

相关文章

来自专栏微服务

C# 如何在Excel 动态生成PivotTable

Excel 中的透视表对于数据分析来说,非常的方便,而且很多业务人员对于Excel的操作也是非常熟悉的,因此用Excel作为分析数据的界面,不失为一种很好的选择...

27212
来自专栏葡萄城控件技术团队

ASP.NET Web API 应用教程(一) ——数据流使用

相信已经有很多文章来介绍ASP.Net Web API 技术,本系列文章主要介绍如何使用数据流,HTTPS,以及可扩展的Web API 方面的技术,系列文章主要...

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

ASP.NET MVC 微信JS-SDK认证

1643
来自专栏.NET开发那点事

.NET开源高性能Socket通信中间件Helios介绍及演示

  Helios是一套高性能的Socket通信中间件,使用C#编写。Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量。H...

822
来自专栏区块链

打造属于自己的比特币钱包

为了能够顺利地读懂本文,您需要有一点C#编程经验并且熟悉NBitcoin。当然如果你研究过Bitcoin C# book就更好了。

73112
来自专栏hbbliyong

使用WPF教你一步一步实现连连看(一)

第一步:   问题,怎样动态的建立一个10*10的grid(布局) 第二步:   问题,怎样将button放到上边那个布局中(这个是我查资料才知道的,一般都是用...

2624
来自专栏Golang语言社区

GO语言使用gopsutil包进行机器信息采集

GO语言本身拥有极强的性能,非常适合做一些后端的数据采集管理以及运维系统。 其中会面临对当前系统信息的采集,我在这里使用的是GO的工具包 gopsutil 贴出...

3808
来自专栏Golang语言社区

fasthttp中的协程池实现

fasthttp中的协程池实现 协程池可以控制并行度,复用协程。fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了协程池。实现并不复杂,...

4929
来自专栏逸鹏说道

在创建带输出参数和返回值的存储过程时---犯下的一个低级错误

异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html 后期会在博客首发更新:http://d...

26411
来自专栏.NET技术

编写自己的dapper lambda扩展-使用篇

这是针对dapper的一个扩展,支持lambda表达式的写法,链式风格让开发者使用起来更加优雅、直观。现在暂时只有MsSql的扩展,也没有实现事务的写法,将会在...

752

扫码关注云+社区