- How do I know whether or not my list is being virtualized?
How do I make this snippet virtualized?
<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>
问题:
回答1:
Your code sample does not virtualize because you are forcing the use of a StackPanel
. You have to use a VirtualizingStackPanel
.
回答2:
- If you want to know for certain. Download Snoop it has a 3d view that you can use to see every element that is rendered. (on and off screen) If your list box is not virtualised you will see all the list items marching off the page in a lovely 3d view.
It is an essential tool for the wpf developer as it has a couple of other really handy features as well
- Get rid of that list box template that uses a stack panel. If all it is doing is making the background black, then just set the background black.
回答3:
To know if it is virtualized you can simply add 10K dummy entries to the collection and see how fast the loading happens as well as how fast the vertical scroll works which will clearly tell a big difference.
I guess you need to change your StackPanel
in the control template to VirtualizingStackPanel
.
回答4:
According to the MSDN forums, All databound listboxes are virtualized
You can check what's going on in your app using Snoop - Mouse over your listbox (or one of the items) and look at the properties. One of them is VirtualizingStackPanel.IsVirtualizing
- it will be checked if the list is virtualized, and unchecked if not