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

StackOverflow https://stackoverflow.com/questions/36108

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Видишь эта статья приведу простой пример.

Другие советы

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

HorizontalContentAlignment="Stretch"

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

HorizontalAlignment="Stretch"

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

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

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

В DockPanel я пристыковал вещи в неправильном порядке. Если TextBox или ListBox является единственным закрепленным элементом без выравнивания или если они добавлены последними, они БУДУТ заполнять оставшееся пространство по желанию.

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

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

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

Значением по умолчанию для обоих свойств является Stretch, поэтому дочерний элемент растягивается, чтобы заполнить все доступное пространство. Дополнительные параметры включают Левый, Центральный и Правый для Горизонтальное выравнивание и Верхний, Центральный и Нижний для Вертикальное выравнивание .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top