WPF DataGrid呈现速度非常慢
我曾尝试使用定制的DataGrid以及WPF中的股票。我曾尝试通过绑定手动填充它们。在这两种情况下,他们都很慢。WPF DataGrid呈现速度非常慢
我有一个场景,用户点击一个按钮,并出现一个DataGrid与适当的数据。目前,我处于概念模式的证明和仅使用示例数据。我有一个包含10行的表的数据集。
如果我没有附加任何数据到DataGrid,当我单击按钮时,空的DataGrid显示非常快,用户无法察觉延迟。只要我添加10行数据,对于6列,延迟大约为2秒,对用户来说非常明显。
我甚至试图用空数据填充,只是为了得到一个空的网格出现,它同样缓慢。
for (int i = 0; i < 10; i++)
_dataGrid.Items.Add("");
我把定时器计数从当按钮被点击时,所有的代码被执行绘制的DataGrid到蜱,它大约是20毫秒,所以代码执行速度非常快,但在屏幕是大滞后的地方。我尝试了一个GridView,它在屏幕上呈现得非常快。
我听说过慢DataGrid绘制复杂场景和使用1000行的各种报告,但这是非常简单的,6列乘10行填充空数据。
只读显示是GridView对DataGrid同样可行的选项吗?
更新
这里是我列的创建过程。
DataGridTextColumn column = new DataGridTextColumn();
column.ColumnWidthChanged += new ColumnWidthChangedEventHandler(column_ColumnWidthChanged);
column.Header = entity.GetPropertyValue("ColumnLabel");
column.Binding = new Binding(entity.GetPropertyValue("Tag"));
column.Width = new DataGridLength(entity.GetPropertyDouble("DisplaySize"));
_dataGrid.Columns.Add(column);
这是我如何将DataSet与10行绑定在一起。不知道我可以做不同的事情。
您有:
- 启用
VirtualizingStackPanel.VirtualizationMode
一格?如果没有 - 尝试设置。 - 为DataGrid设置VirtualizingStackPanel.IsVirtualizing =“true”
- 用StackPanel容器包装网格吗?如果是 - 尝试删除。
- 由外部ScrollViewer控件包装网格?如果是 - 尝试删除。
还有一点, 可以一次绑定整个项目集合,而不是将每个项目添加到grid.Items集合?
尝试粘贴我的XAML,但没有出现,我会尝试更新我的原始问题。 DataGrid包含在DockPanel中。否ScrollViewer,我不参考VirtualizingStackPanel.VirtualizationMode。 –
尝试将VirtualizingStackPanel.VirtualizationMode设置为回收,例如:
DataGrid
性能问题的一般提示:我在DataGrid中遇到了一个问题,它在窗口调整大小,列排序等操作后花费了几秒的时间来刷新,并锁定了窗口UI(1000行,5列)。
它回到了一个问题(错误?)与WPF大小计算。我把它放在一个网格中,这个网格导致渲染系统试图在运行时重新计算DataGrid的大小,通过测量每一列和每一行的大小,大概是通过填充整个网格(据我所知) )。它应该以某种方式智能处理,但在这种情况下不是。
快速检查这是否是相关问题是在测试期间将DataGrid的Height
和Width
属性设置为固定大小,然后再次运行。一旦恢复性能,永久修复可以是这些选项中选择:
- 变化的含元件的尺寸可相(*)或 固定值
- 设置
MaxHeight
和DataGrid的MaxWidth
到固定值大 比它可能在正常使用 - 得到尝试不同的大小调整战略的另一个容器类型(
Grid
,DockPanel
等)
我对包含在布局Grid的星号大小的行中的DataGrid有同样的问题。按照建议设置MaxHeight就像魅力一样。 – EagleBeak
在我的情况下,我有一个DataGridCell ControlTemplate的问题,减缓了渲染方式。
注意相对加载速度对于大型数据集是使用TextBlock的非常不同的(这不是可选择的文本)以只读模式或文本框:
加载时间59秒:
<Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<TextBox IsReadOnly="True" Text="{Binding Mode=OneWay}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
加载?? 21秒时:
<Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<ContentPresenter Content="{Binding}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
加载时间16秒:
<Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<TextBlock Text="{Binding}"></TextBlock>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我有一个表面临3上我的DataGrid,拥有约200行10列,是在滚动,生涩而犹豫不决很慢。
我认为这是网络,但它实际上是显卡无法跟上 - 等待它 - 对数据网格本身的投影效果,即使控件的背景设置为纯色。
我评论了效果,它是4-5倍更快。
希望这会有所帮助。
A blog我在Google上找到了一个解决方案。正如作者所说,我禁用了GroupStyle,并且解决了渲染速度问题。但我需要分组。作者说
VirtualizingPanel.IsVirtualizingWhenGrouping
被添加到.NET 4.5。所以我把它设置为true。现在通过分组快速渲染。问题是...滚动是生涩。不是令人难以接受的生涩,但明显生涩。当我尝试创建一个扩展了2000多个节点的TreeView时,我遇到了类似的问题。没有虚拟化,渲染速度很慢,但滚动平稳。通过虚拟化,渲染速度非常快,但滚动却不稳定。
为什么我们不能兼得......
这条单线解决了我确切的问题 - 非常感谢!当我最终意识到渲染是真正的问题时,我正在用asyn来加载数据。添加了'VirtualizingPanel.IsVirtualizingWhenGrouping =“True”',我的DataGrid的人口从现在的10秒左右降到了不到1秒。 – M463
这个也适合我!从10-30秒减少到小于1. –
我有绑定数据网格同样的问题,我注意到,在第一次加载速度快,但对secand和明年它是缓慢的。所以,当我在代码
DataGrid.ItemsSource = Nothing
添加,然后TableAdapter.Fill(Mydataset.MyStoredProcedure,....) DataGrid.ItemsSource=Mydataset.MyStoredProcedure
它变得非常快
对我来说是:
<Setter Property='ScrollViewer.CanContentScroll' Value='False' />
我删除这个从风格和渲染成了快。
为了澄清,将ScrollViewer.CanContentScroll设置为'true',因为'false'的值将禁用虚拟化。 – kjhf
那么一点点增加更多的(我知道它很老的话题,但它仍然可以帮助别人)...
我试图
EnableColumnVirtualization="True" VirtualizingPanel.VirtualizationMode="Recycling"
EnableRowVirtualization="True"
的DataGrid中(AutoGenerateColumns="True"
)结合DataTable.DefaultView ()并且对速度没有影响,但对于Speed以及行间导航仍然很糟糕。相比之下,我想出了设置DataGrid固定高度和宽度的解决方案。另外我还设置
RowHeight="23"
ScrollViewer.HorizontalScrollBarVisibility="Visible"
ScrollViewer.VerticalScrollBarVisibility="Visible"
这使我的页面填写非常快......而不是2分钟,现在几乎需要10-12秒。
希望它可以帮助别人。
注意:我使用.Net 4.5
也许它的硬件? –
我已经尝试过另一个系统上的应用程序,并且速度也很慢。问题是某些视图上有多个DataGrid,所以每个额外的DataGrid延迟都会增加。 –
我使用标准的WPF数据网格与动态列和更多然后10000rows,没有问题。什么是你的itemssource?一个数据表或一些集合?希望你没有像在你的帖子中添加项目? – blindmeis