3

有没有人可以在 WPF 应用程序中使用功能正常的虚拟化 WrapPanel?

我已经在http://virtualwrappanel.codeplex.com/下载并尝试了实现。但是,我得到以下异常:

“元素 'MyNamespace.VirtualizingWrapPanel' 的布局测量覆盖不应返回 PositiveInfinity 作为其 DesiredSize,即使 Infinity 作为可用大小传入也是如此。”

这是在尝试将包装面板应用于 ListBox 时

4

2 回答 2

7

这可能是一个您可以自己修复的错误。寻找MeasureOverride方法。它似乎总是返回availableSize传递给方法的至极。正如异常所述,availableSize当它包含double.PositiveInfinity. 所以试试这个:

if(availableSize.Width == double.PositiveInfinity || availableSize.Height == double.PositiveInfinity)
{
    return Size.Empty;
}

// all the measureoverride code comes here

return availableSize;

我没有详细查看实现。MeasureOverride但是谁知道呢,如果面板不保存and之间的状态ArrangeOverride(如果它实施得很好,它不应该),你也许可以摆脱这个。

于 2010-09-20T05:08:35.440 回答
6

出现这个问题的原因可能是您的列表框位于另一个控件中,例如堆栈面板或滚动查看器,它允许列表框增长到它喜欢的任何大小。虽然在这种情况下虚拟环绕面板不应该给出错误,但它确实解释了性能问题。

在这种情况下,即使使用 Microsoft 自己的虚拟化面板之一也无法解决性能问题,因为虚拟化失败了。由于列表框可以增长到它喜欢的任何大小,它会这样做并绘制所有项目,即使它们不在屏幕上......因此虚拟化不适用。

如果您确保您的列表框不在这些容器之一中,您应该会发现虚拟化开始工作性能显着提高。

于 2011-04-22T09:50:57.087 回答