DataGrid не прокручивается плавно - PullRequest
2 голосов
/ 16 декабря 2011

У меня есть DataGrid, который обычно содержит около 30 строк, он редко превышает 200. Моя проблема заключается в том, что когда пользователь просматривает содержимое сетки с помощью клавиш со стрелками вверх / вниз, он продолжает зависать (примерно от 10 до 40 секунд)а затем перепрыгивает несколько строк за раз

My DataGrid

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

Он не использует Entity Framework, а данные находятся на очень занятом виртуальном сервере.

Может кто-нибудьуказать где-нибудь, чтобы найти решение или указать какие-либо проблемы в моем XAML?

РЕДАКТИРОВАТЬ

Я начинаю думать, что я просто пытаюсь заставить сетку делать слишком много!

Ответы [ 3 ]

0 голосов
/ 16 декабря 2011

вы отключаете EnableRowVirtualization и EnableColumnVirtualization, а также делаете что-то в PreviewKeyDown = "DgInvoiceLines_PreviewKeyDown"

это может замедлить прокрутку сетки

0 голосов
/ 01 марта 2013

Является ли ваша DataGrid в ScrollViewer ? У меня была проблема, когда DataGrid не виртуализировал бы свой контент, потому что ScrollViewer предоставил ему бесконечное пространство, которое он затем использовал. Так что, если это так, вытащите его из ScrollViewer.

Если вы не уверены, правильно ли он виртуализируется, вы можете загрузить программу профилирования памяти (то есть ANTS) и проверить, сколько экземпляров ячеек DataGrid существует на момент снижения производительности.

0 голосов
/ 16 декабря 2011

НЕ РАБОТАЕТ:

Единственное, что я могу догадаться, это то, что вы запускаете клетки во время прокрутки.Это может замедлить прокрутку.Попробуйте закомментировать ваши триггеры и посмотрите, устраняет ли это проблему с прокруткой.Может быть, это не то, что вы хотите, но это единственное, что я вижу, что это замедляет прокрутку.

Единственное, что я видел, замедляет прокрутку сетки данных в WPF -Это изображения внутри строк.

ПОДХОД 2:

Еще одна вещь, которую вы можете попробовать, это отказаться от использования сетки данных и просто использовать сетку для отображения ваших данных.Почти то же самое, но сетка намного легче контроля.Я никогда не использовал сетку данных в WPF, но я слышал, что она не очень хороша по производительности, поэтому я просто использовал сетку.

Хороший пример использования сетки для отображения ваших данных:1011 *http://msdn.microsoft.com/en-us/library/aa480224.aspx

...