如何将此代码段虚拟化?
<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>
答案 0 :(得分:13)
您的代码示例未虚拟化,因为您强制使用StackPanel
。您必须使用VirtualizingStackPanel
。
答案 1 :(得分:7)
它是wpf开发人员必不可少的工具,因为它还有其他几个非常方便的功能
答案 2 :(得分:2)
要知道它是否已虚拟化,您只需在集合中添加10K虚拟条目,即可了解加载的速度以及垂直滚动的工作速度,这将明显区分出很大差异。
我想您需要将控件模板中的StackPanel
更改为VirtualizingStackPanel
。
答案 3 :(得分:1)
According to the MSDN forums, All databound listboxes are virtualized
您可以使用Snoop检查应用中发生的情况 - 将鼠标悬停在列表框(或其中一个项目)上,然后查看属性。其中一个是VirtualizingStackPanel.IsVirtualizing
- 将检查列表是否已虚拟化,如果不是则未选中