WPF:列表框和虚拟化

时间:2010-01-27 00:04:00

标签: wpf listbox virtualization

  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 个答案:

答案 0 :(得分:13)

您的代码示例未虚拟化,因为您强制使用StackPanel。您必须使用VirtualizingStackPanel

答案 1 :(得分:7)

  1. 如果你想知道肯定的话。下载Snoop它有一个3d视图,您可以使用它来查看呈现的每个元素。 (打开和关闭屏幕)如果您的列表框没有虚拟化,您将看到所有列表项在可爱的三维视图中从页面上移动。
  2. 它是wpf开发人员必不可少的工具,因为它还有其他几个非常方便的功能

    1. 摆脱使用堆栈面板的列表框模板。如果它只是将背景设为黑色,那么只需将背景设置为黑色。

答案 2 :(得分:2)

要知道它是否已虚拟化,您只需在集合中添加10K虚拟条目,即可了解加载的速度以及垂直滚动的工作速度,这将明显区分出很大差异。 我想您需要将控件模板中的StackPanel更改为VirtualizingStackPanel

答案 3 :(得分:1)

According to the MSDN forums, All databound listboxes are virtualized

您可以使用Snoop检查应用中发生的情况 - 将鼠标悬停在列表框(或其中一个项目)上,然后查看属性。其中一个是VirtualizingStackPanel.IsVirtualizing - 将检查列表是否已虚拟化,如果不是则未选中