WPF - 虚拟化WrapPanel

3
有没有人有一个可用的虚拟化WrapPanel,我可以在WPF应用程序中使用?
我已经下载并尝试了http://virtualwrappanel.codeplex.com/上的实现。 但是,我遇到了以下异常:
“元素'MyNamespace.VirtualizingWrapPanel'的布局测量覆盖不应返回PositiveInfinity作为其DesiredSize,即使将Infinity作为可用大小传递。”
这是在尝试将wrappanel应用于ListBox时发生的。
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;

我还没仔细看实现方式。但是谁知道呢,如果面板在MeasureOverrideArrangeOverride之间不保存状态(如果它实现得好的话),那么你也许能够成功地做到这一点。

谢谢bitbonk,我已经做出了这个更改并修复了异常,但性能似乎比普通的WrapPanel要差得多。是否有任何商业虚拟化wrappanel可用且性能良好? - devdigital

6
那个问题可能是因为您的列表框位于另一个控件(如stack panel或scroll viewer)内,这使得列表框可以增长到任意大小。虚拟换行面板在这种情况下不应该出现错误,但它确实解释了性能问题。
即使使用Microsoft自己的虚拟化面板也无法解决此问题中的性能问题,因为虚拟化被打败了。由于列表框可以增长到任意大小,因此即使它们不在屏幕上,它仍会绘制所有项目...因此虚拟化不适用。
如果确保您的列表框不在这些容器中之一,则应发现虚拟化开始工作并且性能显着提高。

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