首页 文章

WPF DataGrid渲染速度很慢

提问于
浏览
30

我尝试过使用自定义的DataGrid以及WPF中的库存 . 我尝试过手动填充它们以及通过绑定 . 在这两种情况下,它们都很慢 .

我有一个场景,用户点击一个按钮,DataGrid会显示适当的数据 . 目前我在概念模式的证明,只使用样本数据 . 我有一个DataSet,其中包含10行 .

如果我单击按钮时没有将任何数据附加到DataGrid,则空DataGrid会立即显示,用户无法察觉延迟 . 一旦我添加10行数据,对于6列,延迟大约为2秒,对用户来说非常明显 .

我甚至尝试填充空数据,只是为了得到一个空网格,它同样慢 .

for (int i = 0; i < 10; i++)
    _dataGrid.Items.Add("");

我设置了一个计时器来计算从单击按钮到执行所有代码以绘制DataGrid时的刻度,它大约是20毫秒,因此代码执行速度非常快,但在屏幕上是大滞后的地方 . . 我尝试了一个GridView,它在屏幕上渲染得非常快 .

我听过各种关于使用复杂场景和使用1000行的DataGrid绘制缓慢的报告,但这很简单,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行 .

_dataGrid.ItemsSource = ds.Tables[0].DefaultView;
                _dataGrid.DataContext = ds.Tables[0];

不知道我能做些什么不同 .

9 回答

  • 22

    你有:

    • 为网格启用 VirtualizingStackPanel.VirtualizationMode ?如果不是 - 尝试设置 .

    • 为DataGrid设置VirtualizingStackPanel.IsVirtualizing = "true"

    • StackPanel容器包装了一个网格?如果是 - 尝试删除 .

    • 通过外部ScrollViewer控件包装网格?如果是 - 尝试删除 .

    还有一点,您是否可以一次绑定整个项目集合,而不是将每个项目添加到grid.Items集合中?

  • 10

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

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

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

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

    • 将DataGrid的 MaxHeightMaxWidth 设置为大于正常使用时的固定值

    • 尝试使用不同大小调整策略的其他容器类型( GridDockPanel 等)

  • 3

    A blog我在Google上找到了一个解决方案 . 正如作者所说,我禁用了GroupStyle,解决了渲染速度问题 . 但我需要分组 . 作者说

    VirtualizingPanel.IsVirtualizingWhenGrouping
    

    添加到.NET 4.5 . 所以我把它设置为真 . 现在,通过分组可以快速渲染 . 问题是......滚动是生涩的 . 没有不可接受的生涩,但明显生涩 . 当我尝试创建扩展了2000个节点的TreeView时,我遇到了类似的问题 . 没有虚拟化,渲染速度很慢但滚动很顺利 . 通过虚拟化,渲染很快但滚动不稳定 .

    为什么我们不能同时拥有......

  • 1

    在我的情况下,我遇到了DataGridCell ControlTemplate的问题,这减慢了渲染速度 .

    请注意,在ReadOnly模式下使用 TextBlock (不是可选文本)或 TextBox 时,大数据集的相对加载速度非常不同:

    Loading time 59 seconds:

    <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>
    

    Loading time 21 seconds:

    <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>
    

    Loading time 16 seconds:

    <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>
    
  • 1

    好吧有点添加更多(我知道它非常古老的主题,但它仍然有助于某人)...

    我试过了

    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

  • 1

    我有一个Surface Pro 3,我的数据网格,大约有200行和10列,在滚动,生涩和犹豫时非常慢 .

    我认为这是网络,但事实上显卡无法跟上 - 等待它 - 对数据网格本身的阴影效果,即使控件的背景设置为纯色 .

    我评论了效果,它的速度提高了4-5倍 .

    希望这可以帮助 .

  • 12

    我对绑定数据网格有同样的问题,我注意到在第一次加载时它很快但在秒和下一步它很慢 . 所以当我添加代码时

    DataGrid.ItemsSource = Nothing 然后 TableAdapter.Fill(Mydataset.MyStoredProcedure,....) DataGrid.ItemsSource=Mydataset.MyStoredProcedure 它变得非常快

  • 31

    我有1000行,5列的大问题,渲染时间为7-10秒,但在https://www.elegant-software.net/2014/05/performance-of-the-wpf-datagrid.html找到的解决方案立即使网格加载!

    <DataGrid
       EnableRowVirtualization="True"
       EnableColumnVirtualization="True">
    
  • 0

    对我来说是:

    <Setter Property='ScrollViewer.CanContentScroll' Value='False' />
    

    我从样式中删除了这个,渲染变得很快 .

相关问题