我正在使用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;
到一个合理的固定宽度,因为数据网格不必每次发生变化时动态地重新计算宽度(比如添加行,甚至滚动).
由于我看不到您的源代码,因此很难为您提供帮助.特别是因为WPF应用程序的性能受到很多因素的影响.有关要注意的内容的一些提示,请参阅优化WPF应用程序性能.是的 - 在每个单元格中使用xaml非常重要.因为通常性能问题归结为"太多元素".您是否知道TextBox是我认为的30个独立元素?我建议您使用WPF的性能分析工具来了解有关特定问题的更多信息.尽量减少您正在使用的元素数量(例如,在适当的情况下从TextBox切换到TextBlock).
此外,您还必须检查在尝试应用程序的任何PC上是否存在性能问题.也许你正在使用的PC正在迫使WPF进入基于软件的渲染.或者你使用任何BitmapEffects?
编辑:
看看你的代码,我建议你改变
column.Width = DataGridLength.Auto;
到一个合理的固定宽度,因为数据网格不必每次发生变化时动态地重新计算宽度(比如添加行,甚至滚动).
DataGrid性能问题的一般提示:我在DataGrid中遇到了一个问题,在窗口大小调整,列排序等之后,它花了几秒钟的时间来刷新,并锁定了窗口UI(1000行,5列) ).
它归结为一个问题(bug?)与WPF大小计算.我在RowDefinition Height ="Auto"的网格中得到它,这导致渲染系统尝试通过测量每个列和行的大小来尝试重新计算DataGrid的大小,可能是通过填充整个网格(据我所知).它应该以某种方式智能地处理它,但在这种情况下它不是.
快速检查以确定这是否是一个相关问题是在测试期间将DataGrid的高度和宽度属性设置为固定大小,然后再次尝试运行.如果您的性能已恢复,则可以在以下选项中进行永久性修复:
将包含元素的大小更改为相对(*)或固定值
将DataGrid的MaxHeight和MaxWidth设置为大于正常使用时的固定值
尝试另一种具有不同调整大小策略的容器类型(Grid,DockPanel等)