WPF: 列表框和虚拟化

13
  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个回答

14

您的代码示例无法进行虚拟化,因为您强制使用了StackPanel。您必须使用VirtualizingStackPanel


链接bea.stollnitz博客似乎与问题不再相关。我怀疑信息已经移动了。 - artless noise

7
  1. 如果你想确切了解,可以下载Snoop工具,它有一个3D视图,可以用来查看渲染的每个元素(屏幕内外均可)。如果你的列表框没有虚拟化,你将在美丽的3D视图中看到所有的列表项超出页面范围。

这是WPF开发人员必备的工具,因为它还有其他一些非常方便的功能。

  1. 摆脱使用堆栈面板的列表框模板。如果它只是让背景变黑,那么就把背景设置成黑色吧。

如果我不包括该模板,那么鼠标的滚轮就无法工作。我已将其更改为VirtualizingStackPanel。 - Jonathan Allen
我希望我能使用Snoop,但是我无法使其针对.NET 4正常工作。 - Jonathan Allen
抛出 NotFairNoSnoopImplementedException() 异常: - Aran Mulholland

2

要确定是否进行了虚拟化,您可以简单地向集合中添加10K个虚拟条目,并观察加载速度以及垂直滚动的速度,这将明显显示出巨大的差异。

我猜您需要将控件模板中的StackPanel更改为VirtualizingStackPanel


我一定会尝试,但如果没有回答问题1,我就不知道它是否有效。 - Jonathan Allen

1

你有其他用于测试的程序吗?不幸的是,Snoop在.NET 4上无法工作。 - Jonathan Allen
此外,我在其他地方读到,ListBoxes默认只进行虚拟化。一旦开始覆盖某些内容,就可能失去这种效果。 - Jonathan Allen
3
@Jonathan Allen(或者你会把它写成@Jonathan-Allen因为空格的缘故吗?)Snoop现在支持.NET 4.0。(是的,我知道这很老旧,但是嘿……有些人可能不知道!) - Mark A. Donohoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接