当前位置:  开发笔记 > 编程语言 > 正文

WPF Datagrid性能

如何解决《WPFDatagrid性能》经验,为你挑选了2个好方法。

我正在使用WPF Toolkit数据网格,此刻滚动速度非常慢.网格有84列和805行.(包括3个固定列和标题是固定的.)水平和垂直滚动非常慢.虚拟化已打开,我已在xaml中明确启用了列虚拟化和行虚拟化.有什么需要注意的,这可以真正影响性能,例如绑定方法,或每个celltemplate中的xaml是什么?

需要注意的一点是,我在创建datagrid时动态添加列.这会影响到什么吗?(我还同时动态创建celltemplate,以便我的绑定设置正确.)

以下是生成的大多数单元格的模板代码.基本上我需要动态添加的列(大多数是这些),我遍历我的列表并使用AddColumn方法添加列,另外我动态构建模板,以便绑定语句正确索引集合中的正确项目该专栏.模板不是太复杂,只有两个TextBlocks,但我确实在每个上绑定了四个不同的属性.通过更改绑定到OneWay,我似乎能够挤出更多性能:

 private void AddColumn(string s, int index)
    {
        DataGridTemplateColumn column = new DataGridTemplateColumn();
        column.Header = s;
        //Set template for inner cell's two rectangles
        column.CellTemplate = CreateFactViewModelTemplate(index);
        //Set Style for header, ie rotate 90 degrees
        column.HeaderStyle = (Style)dgMatrix.Resources["HeaderRotateStyle"];
        column.Width = DataGridLength.Auto;
        dgMatrix.Columns.Add(column);
    }


    //this method builds the template for each column in order to properly bind the rectangles to their color
    private static DataTemplate CreateFactViewModelTemplate(int index)
    {
        string xamlTemplateFormat =
            @"
            
            
                
                
            
            
            
            
            ";




        string xamlTemplate = xamlTemplateFormat.Replace("~Index~", index.ToString());

        return (DataTemplate)XamlReader.Parse(xamlTemplate);
    }

Tobias Hertk.. 20

由于我看不到您的源代码,因此很难为您提供帮助.特别是因为WPF应用程序的性能受到很多因素的影响.有关要注意的内容的一些提示,请参阅优化WPF应用程序性能.是的 - 在每个单元格中使用xaml非常重要.因为通常性能问题归结为"太多元素".您是否知道TextBox是我认为的30个独立元素?我建议您使用WPF的性能分析工具来了解有关特定问题的更多信息.尽量减少您正在使用的元素数量(例如,在适当的情况下从TextBox切换到TextBlock).

此外,您还必须检查在尝试应用程序的任何PC上是否存在性能问题.也许你正在使用的PC正在迫使WPF进入基于软件的渲染.或者你使用任何BitmapEffects?

编辑:
看看你的代码,我建议你改变

column.Width = DataGridLength.Auto;

到一个合理的固定宽度,因为数据网格不必每次发生变化时动态地重新计算宽度(比如添加行,甚至滚动).



1> Tobias Hertk..:

由于我看不到您的源代码,因此很难为您提供帮助.特别是因为WPF应用程序的性能受到很多因素的影响.有关要注意的内容的一些提示,请参阅优化WPF应用程序性能.是的 - 在每个单元格中使用xaml非常重要.因为通常性能问题归结为"太多元素".您是否知道TextBox是我认为的30个独立元素?我建议您使用WPF的性能分析工具来了解有关特定问题的更多信息.尽量减少您正在使用的元素数量(例如,在适当的情况下从TextBox切换到TextBlock).

此外,您还必须检查在尝试应用程序的任何PC上是否存在性能问题.也许你正在使用的PC正在迫使WPF进入基于软件的渲染.或者你使用任何BitmapEffects?

编辑:
看看你的代码,我建议你改变

column.Width = DataGridLength.Auto;

到一个合理的固定宽度,因为数据网格不必每次发生变化时动态地重新计算宽度(比如添加行,甚至滚动).


使用.net 4.0 DataGrid(以前的工具包),我有同样的问题,我只使用DataGridTextBoxColumns.我有更少的行(20,这意味着行虚拟化在我的情况下是无用的),但是100 cols(这里虚拟化产生了巨大的差异,但是每次水平滚动时仍然需要大约2秒来显示网格和1秒刷新... ).将bindingMode设置为oneWay对我来说没有任何区别:(.仍然试图找到一种让事情变得更快的方法,但是从我可以收集的内容来看,整个DG只是创建单元格的速度非常慢.. .

2> TripleAntige..:

DataGrid性能问题的一般提示:我在DataGrid中遇到了一个问题,在窗口大小调整,列排序等之后,它花了几秒钟的时间来刷新,并锁定了窗口UI(1000行,5列) ).

它归结为一个问题(bug?)与WPF大小计算.我在RowDefinition Height ="Auto"的网格中得到它,这导致渲染系统尝试通过测量每个列和行的大小来尝试重新计算DataGrid的大小,可能是通过填充整个网格(据我所知).它应该以某种方式智能地处理它,但在这种情况下它不是.

快速检查以确定这是否是一个相关问题是在测试期间将DataGrid的高度和宽度属性设置为固定大小,然后再次尝试运行.如果您的性能已恢复,则可以在以下选项中进行永久性修复:

将包含元素的大小更改为相对(*)或固定值

将DataGrid的MaxHeight和MaxWidth设置为大于正常使用时的固定值

尝试另一种具有不同调整大小策略的容器类型(Grid,DockPanel等)


将DataGrid.Height设置为固定值可以解决我的问题。谢谢!
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有