Минимальные и максимальные размеры
23WPF --- Основа WPF --- Минимальные и максимальные размеры
Каждый элемент включает свойства Height и Width, которые позволяют установить явные размеры. Однако предпринимать такой шаг — не слишком хорошая идея. Вместо этого при необходимости используйте свойства минимальных и максимальных размеров, чтобы зафиксировать элемент управления в нужных пределах размеров.
Подумайте дважды, прежде чем устанавливать явные размеры в WPF. В хорошо спроектированной компоновке подобная необходимость возникать не должна. Если вы добавляете информацию о размерах, то рискуете создать хрупкую компоновку, которая не сможет адаптироваться к изменениям (вроде разных языков и размеров окна) и будет усекать содержимое.
Например, можно решить, что кнопки в панели StackPanel должны растягиваться для ее заполнения, но иметь ширину не более 200 и не менее 100 единиц. (По умолчанию кнопки начинаются с минимальной ширины в 75 единиц.) Ниже показана разметка, которая для этого понадобится:
<StackPanel Margin="5">
<Label Content="Example" HorizontalAlignment="Center" Margin="5"></Label>
<Button Margin="5" MaxWidth="200" MinWidth="100">Button 1</Button>
<Button Margin="5" MaxWidth="200" MinWidth="100">Button 2</Button>
<Button Margin="5" MaxWidth="200" MinWidth="100">Button 3</Button>
<Button Margin="5" MaxWidth="200" MinWidth="100">Button 4</Button>
</StackPanel>
Когда панель StackPanel изменяет размеры кнопки, она принимает во внимание несколько единиц информации:
- Минимальный размер
Каждая кнопка всегда будет не меньше минимального размера.
- Максимальный размер
Каждая кнопка всегда будет меньше максимального размера (если только вы не установите неправильно максимальный размер меньше минимального).
- Содержимое
Если содержимое внутри кнопки требует большей ширины, то StackPanel попытается увеличить кнопку. (Для определения размера, необходимого кнопке, можно проверить свойство DesiredSize, которое вернет минимальную ширину или ширину содержимого — в зависимости от того, что из них больше.)
- Размер контейнера
Если минимальная ширина больше, чем ширина StackPanel, то часть кнопки будет усечена. В противном случае кнопке не позволено будет расти шире, чем позволит StackPanel, несмотря на то, что она не сможет вместить весь текст на своей поверхности.
- Горизонтальное выравнивание
Поскольку кнопка использует значение HorizontalAlignment, равное Stretch (по умолчанию), панель StackPanel попытается увеличить кнопку, чтобы она заполнила всю ширину панели.
Сложность понимания этого процесса заключается в том, что минимальный и максимальный размеры устанавливают абсолютные пределы. Без этих пределов панель StackPanel пытается обеспечить желаемый размер кнопки (чтобы вместить ее содержимое) и настройки выравнивания.
На рисунке в некоторой степени проясняется то, как это работает в StackPanel:
Сверху представлено окно в минимальном размере. Кнопки имеют размер по 100 единиц каждая, и окно не может быть сужено, чтобы сделать их меньше. Если вы попытаетесь сжать окно от этой точки, то правая часть каждой кнопки будет усечена. (Такую возможность можно предотвратить применением свойства MinWidth к самому окну, так что окно нельзя будет сузить меньше минимальной ширины.)
При увеличении окна кнопки также растут, пока не достигнут своего максимума в 200 единиц. Если после этого продолжать увеличивать окно, то с каждой стороны от кнопок будет добавляться дополнительное пространство (как показано на нижнем рисунке).
В некоторых ситуациях может использоваться код, проверяющий, насколько велик элемент в окне. Свойства Height и Width в этом не помогут, т.к. отражают желаемые установки размера, которые могут не соответствовать действительному визуализируемому размеру. В идеальном сценарии элементам позволено менять размеры так, чтобы уместить свое содержимое, и тогда свойства Height и Width вообще устанавливать не надо. Узнать действительный размер, используемый при визуализации элемента, можно через свойства ActualHeight и ActualWidth. Однако помните, что эти значения могут меняться при изменении размера окна или содержимого элементов.
Окна с автоматически устанавливаемыми размерами
В данном примере присутствует один элемент с жестко закодированным размером: окно верхнего уровня, которое содержит в себе панель StackPanel (и все остальное внутри). По ряду причин жестко кодировать размеры окна по-прежнему имеет смысл:
Во многих случаях требуется сделать окно меньше, чем диктует желаемый размер его дочерних элементов. Например, если окно включает контейнер с прокручиваемым текстом, нужно будет ограничить размер этого контейнера, чтобы прокрутка стала возможной. Не следует делать это окно чрезмерно большим, чтобы отпала необходимость в прокрутке, чего требует контейнер.
Минимальные размеры окна могут быть удобны, но при этом не обеспечивать наиболее привлекательные пропорции. Другие размеры окна просто лучше выглядят.
Автоматическое изменение размеров окна не ограничено размером области отображения на мониторе. В результате окно с автоматически установленным размером может оказаться слишком большим для просмотра.
Однако окна с автоматически устанавливаемым размером вполне допустимы, и они имеют смысл, когда конструируется простое окно с динамическим содержимым. Чтобы включить автоматическую установку размеров окна, удалите свойства Height и Width и установите свойство Window.SizeToContent в WidthAndHeight. Окно сделает себя достаточно большим, чтобы уместить все содержимое. Можно также позволить окну изменять свой размер только в одном измерении, используя для свойства SizeToContent значение Width или Height.