WPF列调整大小性能问题

3

在WPF中,与网格列调整大小相关的性能问题是否普遍存在?

我的应用程序需要对某一列执行一些特定操作,但我发现无论采用哪种不同的解决方案,列的调整大小都会变得很慢。当我的列表中有超过1000个元素时,这种情况就会出现,但我认为这对于WPF来说并不算太多...所以,总的问题是:您是否经历过列调整缓慢的情况,并且是否已经找到了解决方法?这是什么原因导致的?

以下是我特定情况的一些更多细节:

我的列中可以有两种不同的元素;ComboBox或TextBlock。ComboBox应该填满整个列,并随着列的调整而调整,单击TextBlock的空白区域应选择该行。这就是问题所在。对于所有我的解决方案,列调整大小都会变得很慢。我找到的唯一使调整平滑的方法是添加具有Orientation =“Horizontal”的StackPanel,但是使用此方法我无法实现上述样式。

以下是一些观察结果:

  • 向列表项添加HorizontalContentAlignment =“Stretch”样式将使ComboBoxes伸展并使TextBlocks可点击,但也会使列调整大小变慢。
  • 向StackPanel或插入其中的元素添加Background =“Transparent”样式也可以解决这个问题,但会使调整大小变慢。
  • 添加具有Orientation =“Horizontal”的外部StackPanel会使调整大小平滑,但我无法应用如上所述的样式。

1
我在我的应用程序中以前见过这种情况,但现在不再发生了,我不知道为什么。很抱歉我没有提供更多信息,但至少你知道你不是疯了。你使用的.NET框架版本是什么?微软声称3.5和3.5 SP1有许多性能改进。 - PeterAllenWebb
1个回答

2
您尝试过对ListView中的元素进行虚拟化吗?在进行虚拟化时,虚拟化面板仅会为视图中存在的元素创建可视化内容。这使您可以拥有大量项目而不会出现您所提到的性能问题。有关更多详细信息,请参见VirtualizingStackPanel布局系统。您还可以创建自己的虚拟化面板。如果您在Google上搜索“virtualizing+wpf”,您将会找到许多有关虚拟化Canvases、WrapPanels等的资料。
希望这可以帮助您。

我们之前尝试过对元素进行虚拟化。我不确定这是否解决了调整大小的问题,但在我们的列表中使用虚拟化滚动是一种可怕的体验(很慢!),所以我们无法使用它。在简单的测试应用程序中遇到相同的问题后,我们得出结论,这可能在WPF中还不够成熟。对此有什么看法吗? - stiank81
我知道他们在SP1中对虚拟化进行了几项改进。首先,他们添加了延迟滚动。其次,他们添加了容器回收(作为选项)。我从未在使用VirtualizingStackPanel时遇到任何问题。 - Josh G
所以,虚拟化解决了问题 - 尽管它会产生一个新问题,所以你回答了这个问题。谢谢。实际上 - 问题在于我们使用 TreeView 显示树形结构... 重写代码使用 ListView 替代 TreeView,这基本上解决了所有问题。我可能错了,但是 ListView 看起来比 TreeView 更加成熟。从现在开始会尽量避免使用 TreeView。你对此有什么看法吗?谢谢! - stiank81
你正在运行哪个版本?我听说他们在3.5 SP1中改进了TreeView,但自那以后我没有太多时间去尝试它。我想他们添加了虚拟化,但我不知道是否支持多选。我认为你是对的。对我来说,ListBox/ListView似乎更加稳定。 - Josh G
我已经使用了3.5 SP1版本,但仍然没有多选功能。ListView对我们来说执行得更好,并解决了所有的问题,因此在这个实现中不再使用TreeView :-) - stiank81

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接