Определите ширину самого широкого элемента в ListBox

Если вы явно не устанавливаете ширину ListBox, он автоматически устанавливает свою ширину равной ширине самого широкого видимого элемента. Это означает, что по мере прокрутки вверх и вниз и изменения самого широкого видимого элемента данных ширина самого списка увеличивается и уменьшается.

Итак, как лучше всего найти ширину самого широкого элемента в списке, а затем установить для нее ширину ListBox? Мой шаблон данных для ListBox - это StackPanel, содержащий CheckBox и TextBlock, поэтому, очевидно, ширина текстового блока будет варьироваться в зависимости от длины строки в нем.

Здесь, на SO, уже есть несколько предложений с ответами от «сделай предположение» до " измерить размер текста " (как измерить размер текста в SL, не помещая его в элемент пользовательского интерфейса?).

Может кто-нибудь подкинет мне несколько идей? Я открыт для повторения всех экземпляров шаблона данных, если мне нужно, хотя лучшим вариантом может быть поиск самой длинной строки и вычисление оттуда?


person slugster    schedule 23.09.2010    source источник


Ответы (3)


Не пробовал, но это может сработать: http://thibautvs.com/blog/?p=1775 «ключевым моментом является размещение ListBox в столбце сетки с« автоматическим »режимом размера»

person Teedee    schedule 20.12.2011

ListBox использует VirtualizingStackPanel как ItemsPanel по умолчанию. Поскольку VirtualizingStackPanel создает элементы пользовательского интерфейса только для видимых элементов, вы можете увидеть описанное вами поведение. Чтобы смягчить это поведение, вы можете попытаться установить VirtualizingStackPanel.IsVirtualizing = "False" или изменить ItemsPanel на StackPanel.

person Denis    schedule 23.09.2010

Возникновение с этим показало мне, что это невозможно без расширения / переопределения ListBox - установка свойства IsVirtualizing VirtualizingStackPanel не повлияла.

Решение, с которым мне пришлось пойти, заключалось в том, чтобы программно выбрать хорошую ширину.

person slugster    schedule 17.10.2010