Как получить элементы управления в WPF для заполнения доступного пространства?



некоторые элементы управления WPF (например,Button) кажется, с радостью потребляет все доступное пространство в своем контейнере, Если вы не указываете высоту, которую он должен иметь.



и некоторые, как те, которые мне нужно использовать прямо сейчас, (многострочный)TextBox и ListBox кажется, больше беспокоятся о том, чтобы просто занять место, необходимое для размещения их содержимого, и не более того.



если вы посадите этих парней в камеру в UniformGrid, они будут расширяться, чтобы соответствовать доступное пространство. Однако,UniformGrid примеры не подходят для всех ситуаций. Что делать, если у вас есть сетка с некоторыми строками, установленными на * высоту, чтобы разделить высоту между собой и другими * строками? Что делать, если у вас есть StackPanel и вы Label, a Listи Button, Как вы можете получить список, чтобы занять все пространство, не съеденное этикеткой и кнопкой?



я бы подумал, что это действительно будет основным требованием к макету, но я не могу понять, как заставить их заполнить пространство, которое они могли бы (положить их в DockPanel и установка его для заполнения также не работает, кажется, так как DockPanel только занимает пространство, необходимое по субэлементами его').



изменяемый графический интерфейс был бы довольно ужасен, если бы вам пришлось играть с Height,Width,MinHeight,MinWidth etc.



можете ли вы связать свой Height и Width свойства ячейки сетки, которую вы занимаете? Или есть другой способ сделать это?

647   4  

4 ответов:

каждый элемент управления, производный от Panel реализует отличную логику компоновки, выполненную в Measure() и Arrange():

  • Measure() определяет размер панели и каждого из ее дочерних элементов
  • Arrange() определяет прямоугольник, где каждый элемент управления отображает

последний ребенок DockPanel заполняет оставшееся пространство. Вы можете отключить это поведение, установив LastChild свойство to false.

The StackPanel спрашивает у каждого ребенка его желаемый размер, а затем складывает их. Панель стека вызовов Measure() на каждого ребенка, с доступным размером Infinity а затем использует желаемый размер ребенка.

A Grid занимает все доступное пространство, однако, он установит каждого ребенка на нужный размер, а затем центрирует их в ячейке.

вы можете реализовать свою собственную логику компоновки, производя от Panel и затем переопределение MeasureOverride() и ArrangeOverride().

посмотреть в этой статье для простого примера.

есть также некоторые свойства, которые вы можете установить, чтобы заставить элемент управления заполнить его доступное пространство, когда в противном случае он этого не сделает. Например, вы можете сказать:

HorizontalContentAlignment="Stretch"

... чтобы заставить содержимое элемента управления растягиваться по горизонтали. Или вы можете сказать:

HorizontalAlignment="Stretch"

... чтобы заставить сам элемент управления растягиваться по горизонтали, чтобы заполнить его родитель.

Ну, я понял это сам, сразу после публикации, что является самым смущающим способом. :)

кажется, что каждый член StackPanel просто заполнит свой минимальный запрошенный размер.

в DockPanel я состыковал вещи в неправильном порядке. Если текстовое поле или список являются единственным закрепленным элементом без выравнивания, или если они добавлены последними, они заполнят оставшееся пространство по мере необходимости.

Я хотел бы видеть более элегантный способ обработки это, но он будет делать.

использовать HorizontalAlignment и имеет свойства макета. Они управляют тем, как элемент использует пространство, которое он имеет внутри своего родителя, когда доступно больше места, чем требуется для элемента.

ширина StackPanel, например, будет такой же широкой, как и самый широкий элемент, который он содержит. Таким образом, все более узкие элементы имеют немного избыточного пространства. Свойства выравнивания управляют тем, что дочерний элемент делает с дополнительным пространство.

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

Comments

    Ничего не найдено.