Некоторые элементы управления WPF (например, the Button
), похоже, с удовольствием занимают все доступное пространство в его контейнере, если вы не укажете высоту, которую он должен иметь.
И некоторые, такие как те, которые мне нужно использовать прямо сейчас, (многострочные) TextBox
и другие, ListBox
похоже, больше беспокоятся о том, чтобы просто занять место, необходимое для их содержимого, и не более того.
Если вы поместите этих парней в камеру UniformGrid
, они расширятся, чтобы соответствовать доступному пространству. Однако UniformGrid
случаи не подходят для всех ситуаций. Что если у вас есть сетка с некоторыми строками, установленными на * высоту, чтобы разделить высоту между собой и другими * строками? Что если у вас есть a, StackPanel
и у вас есть a Label
, a List
и a Button
, как вы можете получить список, который будет занимать все пространство, не занятое меткой и кнопкой?
Я бы подумал, что это действительно будет основным требованием к макету, но я не могу понять, как заставить их заполнить пространство, которое они могли бы (поместить их в a DockPanel
и установить для заполнения также, похоже, не работает, так как DockPanel
только занимает пространство , необходимое его субэлементами).
Изменяемый размер GUI будет довольно ужасно , если вы должны были играть с Height
, Width
, MinHeight
, и MinWidth
т.д.
Можете ли вы связать ваше Height
и Width
свойство ячейки сетки вы занимаете? Или есть другой способ сделать это?
источник
Ответы:
Каждый элемент управления , вытекающие из
Panel
орудий отличие логики макета , выполненных вMeasure()
иArrange()
:Measure()
определяет размер панели и каждого ее потомкаArrange()
определяет прямоугольник, в котором отображается каждый элемент управленияПоследний ребенок
DockPanel
заполняет оставшееся пространство. Вы можете отключить это поведение, установивLastChild
свойство вfalse
.StackPanel
Прошу каждый ребенок для его нужного размера , а затем складывает их. Панель стека вызываетMeasure()
каждого дочернего элемента с доступным размером,Infinity
а затем использует требуемый размер дочернего элемента .A
Grid
занимает все доступное пространство, однако, он установит для каждого ребенка желаемый размер, а затем отцентрирует их в ячейке.Вы можете реализовать свою собственную логику компоновки, наследуя
Panel
и затем переопределяяMeasureOverride()
иArrangeOverride()
.Смотрите эту статью для простого примера.
источник
The last child of the DockPanel fills the remaining space
Это был недостающий ключ к моему пониманию. Я всегда думал, что элемент без явного дока заполняет пространство.Есть также некоторые свойства, которые вы можете установить, чтобы заставить элемент управления заполнять его доступное пространство, если в противном случае он этого не сделал бы. Например, вы можете сказать:
... чтобы заставить содержимое элемента управления растягиваться горизонтально. Или вы можете сказать:
... чтобы заставить элемент управления растягиваться горизонтально, чтобы заполнить его родительский элемент.
источник
Ну, я понял это сам, сразу после публикации, что является самым смущающим способом. :)
Кажется, что каждый член StackPanel просто заполнит свой минимальный запрошенный размер.
В DockPanel я закрепил вещи в неправильном порядке. Если TextBox или ListBox является единственным закрепленным элементом без выравнивания, или если они добавлены последними, они БУДУТ заполнять оставшееся пространство по желанию.
Я хотел бы увидеть более элегантный способ справиться с этим, но это подойдет.
источник
Используйте свойства макета HorizontalAlignment и VerticalAlignment . Они контролируют, как элемент использует пространство, которое он имеет внутри своего родителя, когда доступно больше места, чем требуется элементу.
Например, ширина StackPanel будет равна ширине самого широкого элемента, который он содержит. Таким образом, все более узкие элементы имеют немного избыточного пространства. Свойства выравнивания управляют тем, что делает дочерний элемент с дополнительным пространством.
Значением по умолчанию для обоих свойств является Stretch, поэтому дочерний элемент растягивается, чтобы заполнить все доступное пространство. Дополнительные параметры включают Левый, Центральный и Правый для горизонтального выравнивания и Верхний, Центральный и Нижний для вертикального выравнивания .
источник