Загрузка 2 DataGrids + StackPanel с ScrollViewer Займет слишком много времени, Альтернативы? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть 3 элемента содержимого, два DataGrid и StackPanel, которые необходимо прокрутить вместе в приложении WPF. Все работает нормально с ScrollViewer, пока у меня есть только небольшой набор данных, но когда я получаю 500 строк с 150 столбцами, он отстает примерно на 8 секунд перед рисованием экрана. Прочитав это: Неоправданное время загрузки WPF DataGrid Я отключил ScrollViewer, и он загрузился всего за 2,5 секунды.

<ScrollViewer CanContentScroll="True"
              HorizontalScrollBarVisibility="Visible"
              VerticalScrollBarVisibility="Visible">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="20" />
            <RowDefinition Height="22" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <DataGrid x:Name="DataGridViewHeader" CellEditEnding="ColumnNameUpdate" Grid.Row="0" HeadersVisibility="None" HorizontalAlignment="Stretch" Margin="0,0,0,0"  VerticalAlignment="Stretch"  ItemsSource="{Binding}" CurrentCellChanged="DataGridCellChange" Grid.Column="0" DataGridCell.Selected="DataGrid_GotFocus" />
            <StackPanel Orientation="Horizontal" VerticalAlignment="Top" Name="ComboBoxPanel"  Grid.Row="1"  Margin="0,0,0,0"  HorizontalAlignment="Left" >

            </StackPanel>

        <DataGrid x:Name="DataGridView"  Grid.Row="2"    HeadersVisibility="None"    HorizontalAlignment="Stretch" Margin="0,0,0,0"  VerticalAlignment="Stretch"  ItemsSource="{Binding}" CurrentCellChanged="DataGridCellChange" Grid.Column="0"/>

    </Grid>
</ScrollViewer>

Проблема в том, что ScrollViewer предлагает следующий макет, который позволяет мне переименовывать столбцы вверху, использовать выпадающий список во второй строке, чтобы выбрать DataType этого столбца, а затем отображать данные. С 150 столбцами все они должны оставаться в очереди, но производительность имеет огромный успех.

Хотя я понимаю, что ScrollViewer - это простое решение, есть ли лучший способ, если учитывать производительность?

Layout Preview

1 Ответ

0 голосов
/ 18 декабря 2018

удалить ScrollViewer и добавить

   VirtualizingStackPanel.IsVirtualizing="True" 
                VirtualizingStackPanel.VirtualizationMode = "recycling"
                EnableColumnVirtualization = "true"
                EnableRowVirtualization = "true"
                  VirtualizingPanel.IsVirtualizingWhenGrouping="True"
                MaxWidth="2560" MaxHeight="1600"
...