【问题标题】:Debugging WPF DataGrid Virtualization Issue调试 WPF DataGrid 虚拟化问题
【发布时间】:2012-07-07 08:32:27
【问题描述】:

我正在使用 WPF 数据网格(.Net 或 Toolkit),它在绑定到可观察集合时速度慢得令人无法接受。它包含大约 3500 行和 10 列,需要一分钟多的时间来显示内容。一切都表明它没有对数据进行 UI 虚拟化。但是,我不知道为什么会这样。

我没有使用分组。 我通过将网格放置在具有固定高度的面板中来确保包含网格的高度。 我已经在 DataGrid 上设置了所有虚拟化属性。 我已签入 snoop 并设置了这些属性。然而,snoop 也显示加载后可视化树中有数千个数据网格。这是否是由使用 snoop 引起的我不知道。 我尝试使用 AQTime 来了解发生了什么。减速似乎不在我们的代码中,而是在系统代码中。但是,我找不到一种轻松查看 WPF 在做什么的方法。 我已经剥离了网格并尝试了 .Net 4 DataGrid 和工具包 DataGrid。两者都显示初始数据的速度慢得令人无法接受。 我已经尝试修复行高和列宽。这也没什么区别。

如何确认虚拟化已开启,如果已关闭,为何关闭? 如何调试代码之外发生的事情?有什么方法可以查看 WPF 在做什么? (我尝试过使用 WPF 性能套件,但由于某种原因它没有为我们的应用程序提供任何输出)。

我的想法已经不多了。当 UI 中只有 10 行可见时,它不应该这么慢。

谁能帮忙?

【问题讨论】:

标签: wpf performance debugging datagrid


【解决方案1】:

确保ScrollViewer.CanContentScroll 未设置为False

请参阅Why setting ScrollViewer.CanContentScroll to false disable virtualization 了解说明。

顺便说一句:WPF 4.5 引入了New features for the VirtualizingPanel,这可能会对您有所帮助。

【讨论】:

  • 作者的 WPF 4.5 链接已失效,但请查看我对商品的回答。
【解决方案2】:

已接受的与 WPF 4.5 中的虚拟化功能相关的答案中的链接已失效,但这是一个摘要。

如果您使用的是 WPF 4.5,则可以通过保留 ScrollViewer.CanContentScroll="true"(即不更改默认值)并设置 VirtualizingStackPanel.ScrollUnit="Pixel" 来获得基于像素的滚动和虚拟化。示例:

<ListView ItemsSource="{Binding YourItems}"
    ItemTemplate="{StaticResource YourListItemTemplate}"
    VirtualizingStackPanel.ScrollUnit="Pixel"/>

我们看到渲染由文本框、组合框和按钮组成的复杂 DataTemplate 的 200 个实例平均需要 4.7 秒,但是通过重新启用 CanContentScroll 并设置 ScrollUnit 反而将渲染时间缩短到0.08 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2011-10-20
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多