Я используюсь от форм окон, что я создаю панель, средства управления местом в ней и даю им DockStyle.Fill
истратить их размер к окружающей панели.
В WPF я хочу иметь то же. У меня есть TabControl, и я хочу, чтобы его размер заполнил как можно больше формы. Я имею ленточный контроль (RibbonControlsLibrary) и хочу, чтобы остальная часть формы была заполнена TabControl в макс. размере.
(Я не хочу прикреплять средства управления как прикрепление в Visual Studio, просто старые механизмы прикрепления),
WPF-эквивалент WinForms's DockStyle.Fill:
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Это значение по умолчанию для почти всех элементов управления, поэтому в общем случае вам не нужно ничего делать, чтобы элемент управления WPF заполнил свой родительский контейнер: Они делают это автоматически. Это справедливо для всех контейнеров, которые не сжимают свои дочерние элементы до минимального размера.
Распространенные ошибки
Сейчас я объясню несколько распространенных ошибок, которые не позволяют HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
работать так, как ожидается.
1. Явное указание высоты или ширины
Одна из распространенных ошибок - явное указание ширины или высоты элемента управления. Поэтому, если у вас есть это:
<Grid>
<Button Content="Why am I not filling the window?" Width="200" Height="20" />
...
</Grid>
Просто удалите атрибуты Width и Height:
<Grid>
<Button Content="Ahhh... problem solved" />
...
</Grid>
2. Содержащая панель сжимает элемент управления до минимального размера
Еще одна распространенная ошибка заключается в том, что содержащая панель сжимает элемент управления до минимального размера. Например, вертикальная панель StackPanel всегда будет сжимать свое содержимое по вертикали до минимального размера:
<StackPanel>
<Button Content="Why am I squished flat?" />
</StackPanel>
Перейдите на другую панель и все будет в порядке:
<DockPanel>
<Button Content="I am no longer squished." />
</DockPanel>
Также, любая строка или столбец Grid, высота которых равна "Auto", будет аналогично сжимать свое содержимое в этом направлении.
Некоторые примеры контейнеров, которые не сжимают своих дочерних элементов:
Некоторые примеры контейнеров, которые сжимают своих дочерних элементов:
3. Явная высота или ширина далее
Удивительно, сколько раз я вижу, как Grid или DockPanel задают явную высоту и ширину, например, так:
<Grid Width="200" Height="100">
<Button Content="I am unnecessarily constrainted by my containing panel" />
</Grid>
В общем, вы никогда не захотите задавать явную высоту или ширину любой панели. Мой первый шаг при диагностике проблем с компоновкой - удалить все явные значения высоты или ширины, которые я могу найти.
4. Окно имеет SizeToContent, когда не должно
Когда вы используете SizeToContent, ваше содержимое сжимается до минимального размера. Во многих приложениях это очень полезно и является правильным выбором. Но если ваше содержимое не имеет "естественного" размера, то вы, вероятно, захотите опустить SizeToContent.
Вы можете делать все, что хотите, просто сказав DockPanel
LastChildFill = "True"
, а затем убедившись, что то, что вы хотите заполнить, на самом деле является последним дочерним элементом!
Grid - это чудовище макета, которое можно заставить делать все, что угодно, но DockPanel обычно является правильным выбором для самой внешней панели макета. Вот пример псевдокода:
<DockPanel LastChildFill="True">
<MyMenuBar DockPanel.Dock="Top"/>
<MyStatus DockPanel.Dock="Bottom"/>
<MyFillingTabControl />
</DockPanel>
просто оберните элементы управления в сетку с двумя рядами. Сетка будет автоматически использовать все отведенное ей пространство, и вы можете определить, что строки будут занимать все оставшееся пространство, задав им высоту "*". Первый ряд в моем примере (Height="Auto") займет столько места, сколько нужно ленте. Надеюсь, это поможет.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Ribbon Grid.Row="0" />
<TabPage Grid.Row="1" />
</Grid>
Добавляя атрибут "Grid.Row=..." к дочерним элементам управления сетки, они получают назначение на строки сетки. Тогда сетка будет определять размеры дочерних элементов в соответствии с определениями строк.