如何在标准 WPF ListView 中启用 UI 虚拟化

2024-05-15

我正在使用 .NET 4.5/VS2012,并且我有一个 ListView 看起来像这样

<ListView 
    VirtualizingPanel.IsContainerVirtualizable="True"
    VirtualizingPanel.IsVirtualizing="True"
    VirtualizingPanel.IsVirtualizingWhenGrouping="True"
    Grid.Row="1"
    Name="eventLogList"
    Margin="5,0,5,0"
    BorderBrush="Black"
    BorderThickness="2"
    ItemsSource="{Binding EventLogs}"
    SelectedItem="{Binding SelectedEventLog}"
    local:ListViewSorter.CustomListViewSorter="EventLogViewer.UI.EventLogItemComparer"
    SelectionMode="Single">

    <ListView.GroupStyle>
        <GroupStyle HidesIfEmpty="False">
            <GroupStyle.ContainerStyle>
                <Style TargetType="GroupItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="GroupItem">
                                <Expander IsExpanded="True">
                                    <Expander.Header>
                                        <TextBlock FontSize="20" TextWrapping="Wrap" Margin="0,10,0,5" >
                                        <Bold><TextBlock Text="{Binding Name}"/></Bold> - <TextBlock FontSize="20" Text="{Binding ItemCount}"/> logs
                                    </TextBlock>
                                    </Expander.Header>
                                    <ItemsPresenter/>
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </ListView.GroupStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn 
                Header="event id"
                Width="120"
                DisplayMemberBinding="{Binding EventID}" />
            <GridViewColumn 
                Header="level"
                Width="160"
                DisplayMemberBinding="{Binding Level}" />
            <GridViewColumn 
                Header="server" 
                Width="160"
                DisplayMemberBinding="{Binding Server}" />
            <GridViewColumn 
                Header="log name" 
                Width="160"
                DisplayMemberBinding="{Binding LogName}" />
            <GridViewColumn 
                Header="source"
                Width="240"
                DisplayMemberBinding="{Binding Source}" />
            <GridViewColumn 
                Header="logged"
                Width="240"
                DisplayMemberBinding="{Binding Logged}" />
        </GridView>
    </ListView.View>
</ListView>

但性能仍然没有任何改善。我找到了一个使用 ListBox 的示例,但是如何虚拟化 ListView?我挣扎了一番。 我听说在以前版本的 WPF 中,通过分组,虚拟化被关闭,但是在 .NET 4.5 中,WPF 有了IsVirtualizingWhenGrouping属性,我已经将其设置为True.

Update:罪魁祸首是自定义样式,删除它后,列表视图像黄油一样流畅运行


“UI 虚拟化仅在内存中存储可见项目但在数据绑定场景中将整个数据结构存储在内存中。相比之下,数据虚拟化仅将屏幕上可见的数据项存储在内存中。”

“默认情况下,当 ListView 和 ListBox 控件的列表项绑定到数据时,将启用 UI 虚拟化。”

有关详细信息,请查看原始 MSDN 源。 https://msdn.microsoft.com/en-us/library/cc716879(v=vs.110).aspx#Displaying

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在标准 WPF ListView 中启用 UI 虚拟化 的相关文章

随机推荐

  • 重新选择 - 创建一个仅用于获取部分状态的记忆选择器是否有意义?

    我有一个普通的选择器 仅用于获取状态的一部分 export const getAllPosts state gt return state posts 如果我使用重新选择来包装选择器 import createSelector from r
  • 在哪里可以下载 Google Cloud Datastore 的离线文档?

    有没有比使用网络爬虫更好的方法来下载谷歌云数据存储文档以供离线查看 我还没有找到任何东西 谢谢 抱歉 我们目前不支持在 Developers google com 上托管的任何文档
  • 底部页脚的 css 布局,动态 ajax 内容更改页面高度

    Update 实际上 我现在通过放弃固定页脚设计来解决这个问题 动态内容移动页脚并适当调整容器大小似乎没有问题 除非页脚最初固定在浏览器底部 我希望其他人最终能够提供一个兼具两全其美的出色解决方案 I spent all day tryin
  • 从 data.frame 中提取时用 NA 填充缺失的列

    我有一个函数 它将具有某些列的数据框作为输入 columns a b z 现在我有一个数据框DF只有很少的这些列DF columns f u z 如果列不在其中 如何创建一个包含所有值为 NA 的列的数据框DF这与DF在柱子上 f u z
  • Google Drive SDK:通过域超级管理员访问权限将文件从一个用户复制到另一个用户

    假设我是域超级管理员 并且 有用户 A 源 要复制的文件 和用户 B 目标 要复制到的文件 是否有可用于此功能的 Google Drive SDK API 当我读到这篇文章时 https developers google com driv
  • 上下文更改后 Docker“协议不可用”

    我改变了我的码头环境 现在 当我运行任何 docker 命令时 我得到protocol not available 如果无法运行任何 docker 命令 如何更改回上下文 基本上我做了以下事情 I ran docker context li
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 如何在 Swift 中创建 UIAlertView?

    我一直在努力在 Swift 中创建 UIAlertView 但由于某种原因我无法得到正确的语句 因为我收到此错误 找不到接受提供的 init 重载 论点 我是这样写的 let button2Alert UIAlertView UIAlert
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • NodeJS CPU 一次飙升至 100%

    我有一个用 NodeJS 编写的 SOCKS5 代理服务器 我正在使用原生net and dgram打开 TCP 和 UDP 套接字的库 它可以正常工作大约 2 天 所有 CPU 的最大利用率约为 30 两天没有重新启动后 一个 CPU 峰
  • 在 Rails 3 中选择性地关闭 Devise 的 Flash 通知

    Devise 身份验证框架在各处都使用 Flash 通知 这使得与应用程序集成变得很容易 但有时会导致用户体验不佳 我想知道有什么简单的方法可以有选择地关闭 Rails 3 应用程序中的一些 Devise flash 通知 特别是 我想摆脱
  • 只允许输入字母

    如何过滤虚拟键盘中的非字母键 以下方法仅适用于拉丁字母 不幸的是 public static bool IsLetter int val return InRange val 65 90 InRange val 97 122 InRange
  • 断点条件错误

    我已经根据条件设置了断点 event name isEqualToString Some Name 这很好用 但是 当我尝试添加另一个带有条件的断点时 part name isEqualToString Some Value With A
  • 为什么版本控制系统缺乏 Visual Source Safe 的共享功能?您使用并认为哪些源代码控制值得尝试?

    我们正在寻找一种版本控制系统来改变我们当前的源安全系统 我们将它与 Visual Studio 一起使用 到目前为止 我们已经失败了 主要原因是我们看到的所有替代方案都不支持 VSS 的一项或多项功能 尤其是我们广泛使用的一项 文件共享 那
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 从部分 XPath 获取完整 XPath

    我正在使用 selenium 和 perl 并在页面上有标签 要访问此标签 我有以下 xpath text some here 需要获取该元素的完整 xpath 的问题 例如 html body table tr any other and
  • 如何使用具有自定义身份验证的 AWS cognito 创建临时 s3 上传安全令牌

    因此 我对 Cognito 的 Amazon 文档中有关其声明的用例之一的内容感到有点困惑 使用您自己的身份系统 允许您的应用程序将数据保存到 AWS 云 就我而言 我想给他们 aws 令牌 以便他们从移动客户端直接上传到 s3 而无需将我
  • let/var 如何解决可变性? [复制]

    这个问题在这里已经有答案了 我没有任何问题 我只是想对有关可变性的问题进行一些澄清 在 Objective C 中我们会使用例如NSMutableArray得到一个可变数组和NSArray得到一个不可变的 我对两者的内部运作了解不多 但据我
  • 使用 for /f 查找并替换字符串为 if 语句和变量

    我编写了一个批处理文件 我想用另一个 txt 文件中的字符串覆盖关键字符串 目前 它完美地复制新的 File txt 文件 但不会用 OldFile txt 文件中的字符串替换字符串 File txt 文件中的字符串示例 密码 Pword
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样