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

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

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

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

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

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

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

Ответы [ 4 ]

214 голосов
/ 31 августа 2008

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

HorizontalContentAlignment="Stretch"

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

HorizontalAlignment="Stretch"

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

151 голосов
/ 31 августа 2008

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

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

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

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

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

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

См. эту статью для простого примера.

17 голосов
/ 30 августа 2008

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

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

В DockPanel я пристыковал вещи в неправильном порядке. Если TextBox или ListBox - единственный закрепленный элемент без выравнивания, или если они добавлены последними, они заполнят оставшееся пространство как требуется.

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

1 голос
/ 31 августа 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...