【问题标题】:DataGrid not scrolling smoothlyDataGrid 滚动不顺畅
【发布时间】:2011-12-16 12:15:08
【问题描述】:

我有一个 DataGrid,它通常包含大约 30 行,它很少超过 200。我的问题是当用户使用向上/向下箭头键浏览网格的内容时,它会一直卡住(大约 10 到 40 秒)然后一次跳几行

我的数据网格

<DataGrid Name="DgInvoiceLines" KeyUp="DgInvoiceLines_KeyUp" BorderBrush="Black"
              RowBackground="Silver" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible"
              AutoGenerateColumns="False" SelectionUnit="FullRow" SelectionMode="Extended" CanUserAddRows="True" CanUserDeleteRows="True" 
              HorizontalContentAlignment="Center" CellEditEnding="DgInvoiceLines_CellEditEnding" VerticalContentAlignment="Center" 
              PreviewKeyDown="DgInvoiceLines_PreviewKeyDown" SelectionChanged="DgInvoiceLines_SelectionChanged" 
              CurrentCellChanged="DgInvoiceLines_CurrentCellChanged" ItemsSource="{Binding}" BorderThickness="0,2,0,0"
              EnableColumnVirtualization="False" EnableRowVirtualization="False" ScrollViewer.CanContentScroll="False">
        <DataGrid.Columns>
            <DataGridTextColumn Width="Auto" Header="ProductCode"  Binding="{Binding ProductCode}"/>
            <DataGridTextColumn Width="250" Header="Description"  Binding="{Binding Description}" FontSize="14"/>
            <DataGridTextColumn Width="61" Header="Inv_Quantity" Binding="{Binding Inv_Quantity}"/>
            <DataGridTextColumn Width="63" Header="Grn_Quantity" Binding="{Binding Grn_Quantity}"/>
            <DataGridTextColumn Width="59" Header="Inv_Price" Binding="{Binding Inv_Price}"/>
            <DataGridTextColumn Width="61" Header="Ord_Price" Binding="{Binding Grn_Price}"/>
            <DataGridTextColumn Width="72" Header="Inv_Total" Binding="{Binding Inv_Total}"/>
            <DataGridTextColumn Width="74" Header="Grn_Total" Binding="{Binding Grn_Total}"/>
            <DataGridTextColumn Width="58" Header="AnalCode" Binding="{Binding AnalCode}"/>
            <DataGridTextColumn Width="60" Header="Vat_Rate" Binding="{Binding Vat_Rate}"/>
            <DataGridTextColumn Width="60" Header="Vat" Binding="{Binding Vat}" IsReadOnly="True"/>
            <DataGridTextColumn Width="Auto" Header="GrnNo"  Binding="{Binding GrnNo}"/>
            <DataGridCheckBoxColumn  Width="Auto" Binding="{Binding Line_Correct}" Header="" >
                <DataGridCheckBoxColumn.CellStyle>
                    <Style TargetType="{x:Type DataGridCell}">
                        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="DataGridCell_PreviewMouseLeftButtonDown"/>
                    </Style>
                </DataGridCheckBoxColumn.CellStyle>
            </DataGridCheckBoxColumn>
            <DataGridTextColumn Width="Auto" Header="Comment" Binding="{Binding Comment}"/>
            <DataGridTextColumn Width="Auto" Header="PerP" Binding="{Binding OuterUnits}" IsReadOnly="True"/>
        </DataGrid.Columns>
        <DataGrid.CellStyle >
                <Style TargetType="{x:Type DataGridCell}">
                    <Style.Triggers>
                        <Trigger Property="IsKeyboardFocused"  Value="True" >
                            <Setter Property="Background" Value="White" />
                            <Setter Property="Foreground" Value="Black" />
                        </Trigger>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Foreground" Value="Black"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
        </DataGrid.CellStyle>
        <DataGrid.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightSteelBlue"/>
        </DataGrid.Resources>
    </DataGrid>

它没有使用实体框架,数据在一个非常繁忙的虚拟服务器上。

谁能指出某个地方寻找解决方案或指出我的 XAML 中的任何问题?

编辑

我开始认为我只是想让网格做太多事情!

【问题讨论】:

  • 如果关闭所有事件并触发并启用虚拟化会发生什么?
  • 然后一次添加一个触发器和事件以找到违规者。

标签: c# wpf xaml datagrid wpfdatagrid


【解决方案1】:

您禁用 EnableRowVirtualization 和 EnableColumnVirtualization 并在 PreviewKeyDown="DgInvoiceLines_PreviewKeyDown" 中执行某些操作

这可能会减慢网格滚动速度

【讨论】:

  • 由于网格通常很短,我认为没有必要进行虚拟化。我在 PreviewKeyDown 事件中注释掉了代码,它仍然很糟糕。
  • 如果你想在你的网格中找到减速,你可以使用 autogeneratecolumns=true 的网格,然后逐步添加更多逻辑并检查网格是否仍然快速: )
【解决方案2】:

没有工作:

我唯一能猜到的是你在滚动时触发单元格的触发器。这可能会减慢滚动速度。尝试注释掉您的触发器,看看是否能解决滚动问题。可能不是您想要的,但这是我能看到的唯一会减慢滚动速度的东西。

我看到的唯一另一件事是减慢 WPF 中数据网格的滚动速度是行内是否有图像。

方法 2:

您可以尝试的另一件事是不再使用数据网格,而只使用网格来显示数据。几乎相同,但网格比控件轻得多。在WPF中我没用过datagrid,但是听说性能不是很好,所以我就用了grid。

使用网格显示数据的好例子是:http://msdn.microsoft.com/en-us/library/aa480224.aspx

【讨论】:

  • 我已经注释掉了触发器和资源,但它没有帮助。都是网格中的唯一数据
【解决方案3】:

您的 DataGrid 是否在 ScrollViewer 中?我有一个问题,DataGrid 不会虚拟化它的内容,因为 ScrollViewer 为它提供了无限的空间,然后它会使用它。 因此,如果是这种情况,请将其从 ScrollViewer 中取出。

如果您不确定它是否正确虚拟化,您可以下载内存分析器程序(即 ANTS)并检查在性能下降时存在多少 DataGrid 单元实例。

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多