C# DataGrid无法平滑滚动

C# DataGrid无法平滑滚动,c#,wpf,xaml,datagrid,wpfdatagrid,C#,Wpf,Xaml,Datagrid,Wpfdatagrid,我有一个DataGrid,它通常包含大约30行,很少超过200行。我的问题是,当用户使用向上/向下箭头键浏览网格内容时,它会一直被卡住(大约10到40秒),然后一次跳过几行 我的数据网格 <DataGrid Name="DgInvoiceLines" KeyUp="DgInvoiceLines_KeyUp" BorderBrush="Black" RowBackground="Silver" HorizontalScrollBarVisibility="Visi

我有一个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中的任何问题吗

编辑

我开始觉得我只是想让网格做的太多了

不起作用:

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

在WPF中,我看到的另一件事情是,如果行中有图像,那么会减慢数据网格的滚动速度

方法2:

您可以尝试的另一件事是从使用datagrid切换到使用grid来显示数据。几乎一样,但网格是一个轻得多的控制。我从未在WPF中使用过datagrid,但我听说它的性能不是很好,所以我只使用了网格

使用网格显示数据的好例子是:

不起作用:

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

在WPF中,我看到的另一件事情是,如果行中有图像,那么会减慢数据网格的滚动速度

方法2:

您可以尝试的另一件事是从使用datagrid切换到使用grid来显示数据。几乎一样,但网格是一个轻得多的控制。我从未在WPF中使用过datagrid,但我听说它的性能不是很好,所以我只使用了网格


使用网格显示数据的好例子是:

禁用EnableRowVirtualization和EnableColumnVirtualization,还可以在PreviewKeyDown=“DgInvoiceLines\u PreviewKeyDown”中执行某些操作


这可能会降低网格滚动的速度

您禁用EnableRowVirtualization和EnableColumnVirtualization,还可以在PreviewKeyDown=“DgInvoiceLines\u PreviewKeyDown”中执行某些操作


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

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


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

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


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

我已经注释掉了触发器和资源,但没有帮助。这些都是网格中唯一的数据。我已经注释掉了触发器和资源,但没有任何帮助。这些都是网格中的数据,因为网格通常很短,我认为虚拟化是不必要的。我在PreviewKeyDown事件中注释掉了代码,结果还是一样糟糕。如果你想发现网格的速度变慢,你可以使用autogeneratecolumns=true的网格,其他什么都不做,然后逐步添加更多的逻辑,检查网格是否仍然快:)因为网格通常很短,我不认为虚拟化是可行的必需的我在PreviewKeyDown事件中注释掉了代码,结果仍然很糟糕。如果您想发现网格中的速度减慢,可以使用autogeneratecolumns=true的网格,而不使用其他任何东西,然后逐步添加更多逻辑,检查网格是否仍然很快:)如果关闭每个事件并触发并启用,会发生什么虚拟化?然后一次添加一个触发器和事件以查找违规者。如果关闭每个事件和触发器并启用虚拟化,会发生什么情况?然后一次添加一个触发器和事件以查找违规者。