0

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

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

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

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

任何人都可以帮忙吗?

4

2 回答 2

1

确保ScrollViewer.CanContentScroll未设置为False.

有关说明,请参阅为什么将 ScrollViewer.CanContentScroll 设置为 false 禁用虚拟化

顺便说一句:WPF 4.5为 VirtualizingPanel 引入了新功能,可能会对您有所帮助。

于 2012-07-09T09:09:29.150 回答
1

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

如果您使用的是 WPF 4.5,则可以通过离开ScrollViewer.CanContentScroll="true"(即不更改默认值)并设置VirtualizingStackPanel.ScrollUnit="Pixel". 例子:

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

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

于 2016-04-11T17:14:31.077 回答