Ответ 1
В WPF есть определенные "контейнерные" элементы управления, которые автоматически изменяют размер содержимого, и есть некоторые, которые этого не делают.
Вот некоторые, которые не изменяют размер содержимого (я предполагаю, что вы используете один или несколько из них):
StackPanel
WrapPanel
Canvas
TabControl
Вот некоторые, которые изменяют размер содержимого:
Grid
UniformGrid
DockPanel
Поэтому почти всегда предпочтительнее использовать Grid
вместо StackPanel
, если вы не хотите автоматического изменения размера. Обратите внимание, что все еще возможно, чтобы Grid
не изменял свои внутренние элементы управления... все зависит от ваших настроек Grid.RowDefinition
и Grid.ColumnDefinition
:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="100" /> <!--<<< Exact Height... won't resize -->
<RowDefinition Height="Auto" /> <!--<<< Will resize to the size of contents -->
<RowDefinition Height="*" /> <!--<<< Will resize taking all remaining space -->
</Grid.RowDefinitions>
</Grid>
Подробнее о элементе управления Grid
можно узнать на странице Grid
Класс в MSDN. Вы также можете узнать больше об этих элементах управления контейнером на странице WPF Container Controls Overview на MSDN.
Дальнейшее изменение размера может быть достигнуто с помощью свойств FrameworkElement.HorizontalAlignment
и FrameworkElement.VerticalAlignment
. Значением по умолчанию для этих свойств является Stretch
, который растягивает элементы в соответствии с размером их элементов управления. Однако, когда они установлены на любое другое значение, элементы не будут растягиваться.
ОБНОВЛЕНИЕ → >
В ответ на вопросы в вашем комментарии:
Используйте настройки Grid.RowDefinition
и Grid.ColumnDefinition
, чтобы сначала организовать базовую структуру... обычно нужно добавлять элементы управления Grid
в ячейки внешних Grid
элементов управления, если это необходимо. Вы также можете использовать свойства Grid.ColumnSpan
и Grid.RowSpan
, чтобы включить элементы управления для размещения нескольких столбцов и/или строк Grid
.
Наиболее распространено иметь хотя бы одну строку/столбец с Height
/Width
of "*"
, который заполнит все оставшееся пространство, но вы можете иметь два или более с этим параметром, и в этом случае оставшееся пространство будет разделено между двумя (или более) строками/столбцами. "Авто" - хорошая настройка для строк/столбцов, которые не установлены в "* *", но это действительно зависит от того, как вы хотите, чтобы макет был.
Нет настроек Auto
, которые вы можете использовать в элементах управления в ячейках, но это так же хорошо, потому что мы хотим, чтобы Grid
определял размеры элементов управления для нас... поэтому мы не хотите установить Height
или Width
этих элементов управления вообще.
То, что я сделал о свойствах FrameworkElement.HorizontalAlignment
и FrameworkElement.VerticalAlignment
, было просто, чтобы вы знали об их существовании... поскольку их значение по умолчанию уже Stretch
, вам обычно не нужно явно устанавливать их.
Свойство Margin
, как правило, просто используется для равномерного распределения ваших элементов управления... если вы перетаскиваете элементы управления из Visual Studio Toolbox, VS устанавливает свойство Margin
, чтобы разместить ваш контроль точно там, где вы его сбросили но, как правило, это не то, что мы хотим, так как это будет бесполезно с автоматическим выбором элементов управления. Если вы это сделаете, просто удалите или отредактируйте свойство Margin
в соответствии с вашими потребностями.