WPF очень медленно рендерит данные - PullRequest
1 голос
/ 21 февраля 2020

Более 8000 объектов привязываются к элементу управления ListView, и у объекта есть два свойства. ie ID и Description). LstViewTextBLocks - это элемент управления Listview, источник элементов которого назначен «представлению», имеющему тип ICollectionView

. Данные быстро загружаются в коде (как было отмечено при отладке), но при рендеринге данных это занимает почти 6 минут, а также когда данные отображаются во время прокрутки, они становятся очень запаздывающими.

<TabItem Header="data" Background="Gray" Name="textPicker" >
    <!--<local:TextPickerView/>-->
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Label DockPanel.Dock="Left" Content="Filter:" Grid.Column="0" Grid.Row="0"/>
        <TextBox Name="TextblockFilter1" Grid.Row="0" Grid.Column="1"
     Text="{Binding TextSearch,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" />

        <ScrollViewer Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" 
                          VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">

            <**ListView** Name="LstViewTextBLocks" 
          VirtualizingStackPanel.VirtualizationMode="Recycling" SelectionMode="Single"                                 
                      VirtualizingPanel.IsVirtualizing="True" IsSynchronizedWithCurrentItem="True"
          SelectedItem="{Binding SelectedItem,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
                <ListView.View>
                    <GridView>
                        **<GridViewColumn Header="ID" Width="Auto" DisplayMemberBinding="{Binding ID}" />
                        <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" />**
                    </GridView>
                </ListView.View>
            </**ListView**>
        </ScrollViewer>
    </Grid>
</TabItem>

ItemsSource моего списка в коде был установлен следующим образом:

this.LstViewTextBLocks.ItemsSource = this.View;

1 Ответ

1 голос
/ 21 февраля 2020

Удалите ScrollViewer из вашего кода. Этот ScrollViewer позволяет ListView занимать всю высоту, необходимую для ваших 8000+ строк. Это приводит к удалению виртуализации из ListView. ListView имеет собственный Scrollviewer, который будет запускаться, а также сравнительно поможет в виртуализации и высокой производительности.

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Label DockPanel.Dock="Left" Content="Filter:" Grid.Column="0" Grid.Row="0"/>
        <TextBox Name="TextblockFilter1" Grid.Row="0" Grid.Column="1"
                 Text="{Binding TextSearch,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" />


            <ListView Name="LstViewTextBLocks" 
                      Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" 
                          VirtualizingStackPanel.VirtualizationMode="Recycling" SelectionMode="Single"                                 
                          VirtualizingPanel.IsVirtualizing="True" IsSynchronizedWithCurrentItem="True"
                          SelectedItem="{Binding SelectedItem,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="ID" Width="Auto" DisplayMemberBinding="{Binding ID}" />
                        <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" />
                    </GridView>
                </ListView.View>
            </ListView>
    </Grid>
...