【问题标题】:WPF column resize performance issuesWPF 列调整大小性能问题
【发布时间】:2009-05-06 12:01:56
【问题描述】:

WPF 中是否存在与调整网格列大小相关的一般已知性能问题?

我有一个应用程序,我需要在一个列中做一些特定的事情,但是对于所有不同的解决方案,我发现调整列大小变得很慢。这适用于我的列表中通常有超过 1000 个元素的情况,但我认为这对于 WPF 来说并不算多..?所以;一般的问题是您是否经历过缓慢的列大小调整,以及您是否找到了解决方案?是什么原因造成的?

关于我的具体案例的更多细节:

我的专栏中可以有两种不同的内容;组合框或文本块。 ComboBox 应该填充整个列并跟随列调整大小,然后单击带有 TextBlock 的列的空白区域应该选择该行。这就是问题所在。对于我必须解决的所有解决方案,列调整大小会变慢。我发现使调整大小变得平滑的唯一方法是在它们之外添加一个 StackPanel,并使用 Orientation="Horizo​​ntal",但是这样我无法实现上述样式。

以下是一些观察:

  • 向列表中的项目添加样式 Horizo​​ntalContentAlignment="Stretch" 会使 ComboBoxes 拉伸并且 TextBlocks 可点击,但列调整大小也会变慢。
  • 将 Background="Transparent" 添加到 StackPanel 或插入其中的元素也可以解决问题,但会使调整大小变慢。
  • 添加属性 Orientation="Horizo​​ntal" 的外部 StackPanel 可以使调整大小变得平滑,但我无法应用所描述的样式。

【问题讨论】:

  • 我以前在我的应用程序中看到过这种情况,但它不再发生,我不知道为什么。很抱歉我提供的信息太少了,但至少你知道你没有疯。您使用的是什么版本的 .NET 框架。 Microsoft 声称在 3.5 和 3.5 SP1 中有许多性能改进。

标签: wpf resize performance


【解决方案1】:

您是否尝试过虚拟化 ListView 中的元素?当您进行虚拟化时,虚拟化面板只会为视图中的元素创建视觉效果。这使您可以拥有大量项目而不会出现您提到的性能问题。有关详细信息,请参阅VirtualizingStackPanel。还有The Layout System。您可以创建自己的虚拟化面板。如果你在 google 上查找“virtualizing+wpf”,你会发现很多关于虚拟化 Canvas、WrapPanel 等的点击。

我希望这会有所帮助。

【讨论】:

  • 我们之前已经尝试过虚拟化元素。我不确定这是否解决了调整大小的问题,但是在我们的列表中使用虚拟化滚动是一种糟糕的体验(慢!),所以我们不能使用它。我们得出的结论是,在更简单的测试应用程序中遇到同样的问题后,这在​​ WPF 中可能还不成熟。对此有何看法?
  • 我知道他们在 SP1 中对虚拟化做了一些改进。首先,他们添加了延迟滚动。其次,他们增加了容器回收(作为一种选择)。我在使用 VirtualizingStackPanel 时从来没有遇到过任何问题。
  • 所以,虚拟化解决了这个问题——尽管它会生成一个新问题,所以你回答了这个问题。谢谢。实际上 - 问题原来是我们使用 TreeView 因为我们展示的是一棵树.. 改写它以使用 ListView ,这几乎解决了所有问题。我可能错了,但 ListViewes 似乎比 TreeView 成熟得多。从现在开始将尽量避免使用 TreeView。对此有何看法?谢谢!
  • 你运行的是什么版本?我听说他们在 3.5 SP1 中改进了 TreeView,但从那以后我没有过多地使用它。我认为他们添加了虚拟化,但我不知道多项选择。我想你是对的。 ListBox/ListView 对我来说似乎也更加稳定。
  • 我已经在使用 3.5 SP1.. 仍然没有多选。 ListView 为我们做得更好,解决了我们所有的问题,所以在这个实现中不再有 TreeView :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2016-10-03
  • 2011-06-06
  • 1970-01-01
  • 2013-06-18
相关资源
最近更新 更多