WPF中UI线程频繁操作造成卡顿的处理(二)

转载请注明原作者

目录

WPF中UI线程频繁操作造成卡顿的处理(一)
WPF中UI线程频繁操作造成卡顿的处理(二)

做法三

做法背景

为了避免窗口UI操作卡顿,在Windows Form开发年代,微软就提出一个解决方案,在处理UI刷新时,使用Application.DoEvents()立即更新界面。参考msdn链接https://msdn.microsoft.com/zh-cn/library/system.windows.forms.application.doevents.aspx

预备知识

(1)在WPF中如何改造实现DoEvents()方法。动态绘制心电图,参考链接:https://social.msdn.microsoft.com/Forums/zh-CN/febcee07-dc8b-44b4-8c0a-246daffdbe2b/wpf-?forum=wpfzhchs
(2)网上早有大师对该种做法进行了深度分析——《从Dispatcher.PushFrame()说起》http://www.cnblogs.com/loveis715/archive/2012/01/11/2319976.html

分析

实际上都是通过DoEvents()方法立即实现UI的重绘,而不是等所有图片加载完毕一次性显示,那样UI界面就卡住了。
代码:

        int i;
        List<String> strings;
        ObservableCollection<String> strs = new ObservableCollection<string>();
        private void Btn_Click(object sender, RoutedEventArgs e)
        {
            strings = loadDir(@"G:\BaiduYunDownload\风景图片壁纸\风景图片壁纸100张");
            strs.Clear();
         
            lb.ItemsSource = strs;
          
            for (int j = 0; j < strings.Count; j++)
            {
                strs.Add(strings[j]);
                DoEvents();
            }
        }
        public void DoEvents()
        {
            DispatcherFrame frame = new DispatcherFrame();
            Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
                new DispatcherOperationCallback(ExitFrames), frame);
            Dispatcher.PushFrame(frame);
        }

        public object ExitFrames(object f)
        {
            ((DispatcherFrame)f).Continue = false;

            return null;
        }

效果

效果与做法二一样。

目录

WPF中UI线程频繁操作造成卡顿的处理(一)
WPF中UI线程频繁操作造成卡顿的处理(二)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容