有没有人可以在WPF应用程序中使用正常运行的虚拟化WrapPanel?
我已经下载并尝试了http://virtualwrappanel.codeplex.com/的实施。但是,我得到以下异常:
“元素'MyNamespace.VirtualizingWrapPanel'的布局测量覆盖不应该将PositiveInfinity作为DesiredSize返回,即使Infinity作为可用大小传入。”
这是在尝试将wrappanel应用于ListBox
时答案 0 :(得分: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
我没有详细查看实现。但是谁知道,如果小组在ArrangeOverride
和{{1}}之间没有保存状态,那么你可能能够解决这个问题(如果它得到很好的实现,它就不应该保存)。
答案 1 :(得分:6)
可能会出现这个问题,因为你的列表框位于另一个控件中,例如堆栈面板或滚动查看器,它允许列表框增长到它喜欢的任何大小。虽然虚拟包装面板在这种情况下不应该出错,但它确实解释了性能问题。
即使使用微软自己的一个虚拟化面板也无法解决这种情况下的性能问题,因为虚拟化失败了。由于列表框可以增长到它喜欢的任何大小,它会这样做并绘制所有项目,即使它们不在屏幕上......因此虚拟化不适用。
如果您确保列表框不在这些类型的容器中,您应该会发现虚拟化开始工作性能显着提高。