【问题标题】:WPF: List boxes and virtualizationWPF:列表框和虚拟化
【发布时间】:2010-01-27 00:03:59
【问题描述】:
  1. 我如何知道我的列表是否正在被虚拟化?
  2. 如何使这个 sn-p 虚拟化?

    <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>
    

【问题讨论】:

    标签: wpf listbox virtualization


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:
    1. 如果您想确定。下载 Snoop 它有一个 3d 视图,您可以使用它来查看渲染的每个元素。 (在屏幕上和屏幕外)如果您的列表框未虚拟化,您将看到所有列表项以可爱的 3d 视图离开页面。

    它是 wpf 开发人员必不可少的工具,因为它还具有其他一些非常方便的功能

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

    【讨论】:

    • 如果我不包含模板,则鼠标上的滚轮不起作用。我确实将其更改为 VirtualizingStackPanel。
    • 我希望我可以使用 Snoop,但我无法让它在 .NET 4 上运行。
    • 抛出 NotFairNoSnoopImplementedException() ):
    【解决方案3】:

    要知道它是否是虚拟化的,您可以简单地向集合中添加 10K 虚拟条目,然后查看加载发生的速度以及垂直滚动的工作速度,这将清楚地说明一个很大的不同。 我想您需要将控件模板中的StackPanel 更改为VirtualizingStackPanel

    【讨论】:

    • 我一定会尝试的,但如果没有对#1 的回答,我将不知道它是否有效。
    【解决方案4】:

    According to the MSDN forums, All databound listboxes are virtualized

    您可以使用Snoop 检查您的应用程序中发生了什么 - 将鼠标悬停在您的列表框(或其中一项)上并查看属性。其中之一是VirtualizingStackPanel.IsVirtualizing - 如果列表是虚拟化的,它将被检查,如果不是,则不检查

    【讨论】:

    • 您还有其他测试程序吗?不幸的是,Snoop 不适用于 .NET 4。
    • 另外,我在别处读到 ListBoxes 默认只虚拟化。一旦你开始覆盖东西,你可能会失去效果。
    • @jonathan allen (或者你写它@jonathan-allen 因为空间?)Snoop 现在支持 .NET 4.0。 (是的,我知道这已经很老了,但是嘿……有些人可能不知道!)
    猜你喜欢
    • 2020-06-03
    • 2012-12-26
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2011-11-26
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多