Как использовать DockStyle.Заполнить для стандартных элементов управления в WPF?
Я использую из windows forms, что я создаю панель, размещаю элементы управления внутри нее и даю им DockStyle.Fill к максимальному вне их размеру к окружающей панели.
в WPF я хочу иметь то же самое. У меня есть TabControl, и я хочу, чтобы его размер заполнял как можно больше формы.
У меня есть ленточный элемент управления (RibbonControlsLibrary) и я хочу, чтобы остальная часть формы была заполнена TabControl с максимальным размером.
(Я не хочу закреплять элементы управления, такие как закрепление в Visual Studio, просто старые стыковочные механизмы)
4 ответов:
эквивалент WPF DockStyle WinForms.Заполните это:
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>просто удалите атрибуты ширины и высоты:
<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>кроме того, любая строка сетки или столбец, высота которых "авто" будет аналогично сжимать его содержимое в этом направлении.
некоторые примеры контейнеров, которые не сжимают своих детей:
- ContentControls никогда не сжимают своих детей (это включает в себя границу, кнопку, CheckBox, ScrollViewer и многие другие)
- сетка с одной строкой и столбцом
- сетка с " * " размером строк и столбцов
- DockPanel не сжимает своего последнего ребенка
- TabControl не сжимает его содержимое
некоторые примеры контейнеров, которые сжимают своих детей:
- StackPanel сжимает в своем направлении ориентации
- сетка с" авто " размером строки или столбца сжимает в том направлении
- DockPanel сжимает все, кроме своего последнего ребенка в их док-направлении
- TabControl сжимает свой заголовок (что отображается на вкладке)
3. Явная высота или ширина дальше
удивительно, сколько раз я вижу сетку или DockPanel, учитывая явную высоту и ширину, например:
<Grid Width="200" Height="100"> <Button Content="I am unnecessarily constrainted by my containing panel" /> </Grid>в общем, вы никогда не хотите давать какой-либо панели явную высоту или ширину. Мой первый шаг при диагностике проблем макета необходимо удалить каждую явную высоту или ширину, которую я могу найти.
4. Окно SizeToContent, когда это не должно быть
когда вы используете SizeToContent, ваш контент будет сжат до минимального размера. Во многих приложениях это очень полезно и является правильным выбором. Но если ваш контент не имеет "естественного" размера, то вы, вероятно, захотите пропустить SizeToContent.
вы можете делать то, что вы хотите сказать
DockPanelLastChildFill="True"а затем убедившись, что вы хотите быть наполнителем на самом деле последний ребенок!сетка-это зверь макета, который вы можете сделать почти все, но DockPanel обычно является правильным выбором для вашей самой внешней панели макета. Вот пример psuedocode:
<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>путем добавления "сетки.Ряд.=."атрибут дочерних элементов управления сетки они получают назначенные строки сетки. Тогда сетка будет размер это дети, как определено определения строк.
Я был попробовать много метод здесь, но не могу решить мою проблему. (Заполните другой элемент управления в control)
пока я не нашел это
<Name_Control Height="auto" Width="auto"/> //default //HorizontalAlignment="Stretch" //VerticalAlignment="Stretch"пример:
//UserControl: <UserControl Name="UC_Test" Height="auto" Width="auto" /> //Grid: <Grid Name="Grid_test" Grid.ColumnSpan="2" Grid.Row="2" /> //Code: Grid_test.Children.Add(UC_Test);для легкой конструкции
<UserControl Name="UC_Test" Height="100" Width="100" /> //Code Grid_test.Children.Add(UC_Test); UC_Test.Width = Double.NaN; UC_Test.Height = Double.NaN;
Comments