WPF - виртуализация WrapPanel - PullRequest
       4

WPF - виртуализация WrapPanel

3 голосов
/ 17 сентября 2010

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

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

"Переопределение измерения макета элемента 'MyNamespace.VirtualizingWrapPanel' не должно возвращать PositiveInfinity в качестве его DesiredSize, даже если в качестве доступного размера передается бесконечность."

Это при попытке применить оболочку к ListBox

Ответы [ 2 ]

7 голосов
/ 20 сентября 2010

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

6 голосов
/ 22 апреля 2011

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

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

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

...