Reputation: 70307
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>
Upvotes: 13
Views: 14448
Reputation: 2956
Your code sample does not virtualize because you are forcing the use of a StackPanel
. You have to use a VirtualizingStackPanel
.
Upvotes: 14
Reputation: 50038
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
.
Upvotes: 2
Reputation: 23935
It is an essential tool for the wpf developer as it has a couple of other really handy features as well
Upvotes: 8
Reputation: 123642
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
Upvotes: 1