一开始我以为时间是花在数据绑定上面,花费很多心思优化,开异步线程,后来才发现是界面渲染,即DataGrid绑定数据后,界面呈现花了很多时间。

虚拟化的作用:假设DataGrid.ItemSource绑定的数据源有5000条数据,窗体大小只能显示40条数据,那么它就会先只实例化这40条数据呈现出来。如果没有实例化,那它会把5000条全部实例化呈现出来。

虚拟化的缺点:没有实例化的部分无法获取。

1、前台xaml

                    <ScrollViewer Name="scrollviewLog" Width="480" Height="250" Margin="5">
                        <DataGrid Name="dataGrid" ItemsSource="{Binding MessageCollection,Mode=OneWay}" Style="{StaticResource dataGridStyleLog}" BorderBrush="#17aeec"
                              BorderThickness="1" VirtualizingPanel.IsContainerVirtualizable="True" VirtualizingPanel.IsVirtualizing="True" 
                              VirtualizingPanel.VirtualizationMode="Recycling">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="{DynamicResource 日志}" Binding="{Binding Message}" Width="auto"/>
                                <DataGridTextColumn Header="{DynamicResource 时间}" Binding="{Binding MessageDate}" Width="200"/>
                            </DataGrid.Columns>
                        </DataGrid>
                    </ScrollViewer>

2、MVVM框架 View Model

        private AsyncObservableCollection<MessageModel> messageCollection = new AsyncObservableCollection<MessageModel>();
        /// 所有消息集合
        /// <summary>
        /// 所有消息集合
        /// </summary>
        public AsyncObservableCollection<MessageModel> MessageCollection {
            get {
                return messageCollection;

3、窗体初始化

        public MessageBoxWindow()
            InitializeComponent();
            dataGrid.DataContext = MessageVM.Instance;
            MessageVM.Instance.MessageCollection.CollectionChanged -= MessageCollection_CollectionChanged;
            MessageVM.Instance.MessageCollection.CollectionChanged += MessageCollection_CollectionChanged;
            MessageVM.Instance.MessagaeBoxWindowClosed = false;

按道理虚拟化可以提高datagrid 界面渲染性能,但是我发现完全不起作用,后来发现外层套的滚动条导致虚拟化没有产生作用,这个滚动条是为了添加日志时,实时滚动到最后一条。这个完全可以用datagrid自带的滚动条做。

修改后前台xaml:

                <DataGrid Name="dataGrid"  ItemsSource="{Binding MessageCollection,Mode=OneWay,IsAsync=True}" 
                          Style="{StaticResource dataGridStyleLog}" BorderBrush="#17aeec" Margin="5"
                          BorderThickness="1" EnableColumnVirtualization="True" EnableRowVirtualization="True">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="{DynamicResource 日志}" Binding="{Binding Message}" Width="auto"/>
                        <DataGridTextColumn Header="{DynamicResource 时间}" Binding="{Binding MessageDate}" Width="200"/>
                    </DataGrid.Columns>
                </DataGrid>

注意两个虚拟化属性

后台滚动条效果:

        void MessageCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
                if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                    dataGrid.ScrollIntoView(dataGrid.Items[MessageVM.Instance.MessageCollection.Count - 1]);
            catch { }
                    一开始我以为时间是花在数据绑定上面,花费很多心思优化,开异步线程,后来才发现是界面渲染,即DataGrid绑定数据后,界面呈现花了很多时间。   虚拟化的作用:假设DataGrid.ItemSource绑定的数据源有5000条数据,窗体大小只能显示40条数据,那么它就会先只实例化这40条数据呈现出来。如果没有实例化,那它会把5000条全部实例化呈现出来。   虚拟化的缺点:没有实例化的部分无法获取。1、前台xaml                    &l...
MySqlMethod sqlMethod = new MySqlMethod();
DataTable dt = sqlMethod.selectAllHIDDev();
dataGrid_devHID.ItemsSource = dt.DefaultView;
我的目的是查询一张表,然后把结果显示在DataGrid中,结果发现仅有一两百条数据就会阻塞UI进程2~3秒,找资料后有以下几点思路解决。
DataGrid是否嵌入在StackPanel
				
需求:自定义Datagrid样式加载大量数据,至少5000条,加载速度的快慢统计? 第一步:自定义Datagrid样式 这个就不多说了,可以参照以下这篇博客,代码什么都有,根据自己想要的样式修改就行 https://blog.csdn.net/qq_20758141/article/details/80845793 第二步:加载大量数据 问题:由于样式太多,大量数据加载时,渲染会变得特别慢,500...
工作中的项目,CS客户端会通过MQ接收前端设备发送的信息,之前测试的时候,由于测试的数据不大,没有进行压力测试,软件可以正常工作,随着项目现场设备数量的增加,CS客户端从MQ中订阅的数据量不断增加,最终导致,客户端界面卡死。原来的数据流程图如下: 这个数据流程,在数据不大的情况下,是没有什么问题,数据太多,从mq获取数据的流程太长,不管是Json反序列化,还是WPF界面渲染...
WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势。 DataGrid 加载数据量时卡 : 1、数据库取数据耗时->优化sql 2、DataGrid 渲染耗时->DataGrid 的EnableCol...
在使用easyui datagrid途中发现加载数据的效率真的不是一般的差。经测试IE8加载300条数据就感觉明显的慢了,加载2000条数据就另人崩溃用时差不多60秒,就算在google浏览器测试结果也快不了几秒。 平时听闻easyui datagrid效率底下,自己测试才发现真是使人无法忍受。 笔者只好百度,google解决方法,发现一篇文章说改 //1.3.3版本是这样的,其它版本也是这句代码 $(_1e0).html(_1e4.join("")); $(_1e0)[0][removed] = _1e4.join(""); 笔者找了类似的地方修改,测试后结果还是一