WPF: списки и виртуализация

  1. Как я узнаю, виртуализирован ли мой список или нет?
  2. Как сделать этот фрагмент виртуализированным?

    <ScrollViewer Grid.Column="1" Name="LogScroller">
        <r:NoInheritanceContentControl>
            <ListBox   Background="Black" ItemsSource="{Binding Path=ActiveLog}" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid Background="Black">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="200"></ColumnDefinition>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition></RowDefinition>
                                <RowDefinition></RowDefinition>
                            </Grid.RowDefinitions>
                            <TextBlock Grid.Column="0" Grid.Row="0" Foreground="White">
                            <TextBlock >Date:</TextBlock>
                            <TextBlock  Text="{Binding Path=LogDate}"/>
                        </TextBlock>
                            <TextBlock Grid.Column="1" Grid.Row="0" Foreground="White">
                            <TextBlock >Severity:</TextBlock>
                            <TextBlock  Text="{Binding Path=Severity}"/>
                        </TextBlock>
                            <TextBlock Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Foreground="LightGray" Text="{Binding Path=Message}"></TextBlock>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
                <ListBox.Template>
                    <ControlTemplate>
                        <StackPanel Background="Black" IsItemsHost="True" >
                        </StackPanel>
                    </ControlTemplate>
                </ListBox.Template>
            </ListBox>
        </r:NoInheritanceContentControl>
    </ScrollViewer>
    

4 ответа

Решение

Ваш пример кода не виртуализируется, потому что вы заставляете использовать StackPanel, Вы должны использовать VirtualizingStackPanel,

  1. Если вы хотите знать наверняка. Загрузите Snoop, у него есть трехмерный вид, который вы можете использовать, чтобы увидеть каждый отображаемый элемент. (на экране и за его пределами) Если ваш список не виртуализирован, вы увидите, что все элементы списка маршируют со страницы в прекрасном трехмерном представлении.

Это важный инструмент для разработчика wpf, так как он имеет несколько других очень полезных функций.

  1. Избавьтесь от этого шаблона списка, который использует панель стека. Если все, что он делает, это делает фон черным, тогда просто установите фон черным.

Чтобы узнать, виртуализирован ли он, вы можете просто добавить в коллекцию фиктивные записи размером 10 тыс. И посмотреть, как быстро происходит загрузка, а также насколько быстро работает вертикальная прокрутка, что явно говорит о большой разнице. Я думаю, вам нужно изменить свой StackPanel в шаблоне управления для VirtualizingStackPanel,

Согласно форумам MSDN, все списки с привязкой к данным виртуализированы

Вы можете проверить, что происходит в вашем приложении, используя Snoop - Наведите указатель мыши на список (или один из элементов) и посмотрите на свойства. Один из них является VirtualizingStackPanel.IsVirtualizing - будет проверено, виртуализирован ли список, и если не проверено,

Другие вопросы по тегам