2010-09-17 5 views
2

У любого есть работающий виртуализатор WrapPanel, который я могу использовать в приложении WPF?WPF - Virtualization WrapPanel

Я загрузил и попробовал реализацию на http://virtualwrappanel.codeplex.com/. Тем не менее, я получаю следующее исключение:

«Переопределение измерения макета элемента« MyNamespace.VirtualizingWrapPanel »не должно возвращать PositiveInfinity в качестве желаемого размера, даже если Infinity передается как доступный размер».

Это при попытке применить WrapPanel к ListBox

ответ

5

Это, вероятно, ошибка, что вы могли бы быть в состоянии исправить себя. Ищите метод 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 (что не должно, если оно хорошо реализовано).

+0

Спасибо bitbonk, я сделал это изменение и исправил исключение, но производительность кажется намного хуже, чем обычная WrapPanel. Существуют ли коммерческие виртуализационные пакеты, доступные с хорошей производительностью? – devdigital

5

Эта проблема, вероятно, происходит из-за того, что у вас есть свой список внутри другого элемента управления, например панель стека или средство просмотра прокрутки, что позволяет увеличить число в любом размере. В то время как виртуальная панель обхода не должна давать ошибку в этом случае, она объясняет проблему с производительностью.

Даже при использовании одной из виртуализирующих панелей Microsoft в этом случае не будут устранены проблемы с производительностью, так как виртуализация будет побеждена. Поскольку список может вырасти до любого размера, который ему нравится, он делает это и рисует все элементы, даже если они не отображаются на экране ... поэтому виртуализация не применяется.

Если вы убедитесь, что ваш список не находится внутри одного из этих типов контейнеров, вы должны найти, что виртуализация начинает работать, производительность значительно улучшается.