Как использовать DockStyle.Заполнить для стандартных элементов управления в WPF?



Я использую из windows forms, что я создаю панель, размещаю элементы управления внутри нее и даю им DockStyle.Fill к максимальному вне их размеру к окружающей панели.



в WPF я хочу иметь то же самое. У меня есть TabControl, и я хочу, чтобы его размер заполнял как можно больше формы.
У меня есть ленточный элемент управления (RibbonControlsLibrary) и я хочу, чтобы остальная часть формы была заполнена TabControl с максимальным размером.



(Я не хочу закреплять элементы управления, такие как закрепление в Visual Studio, просто старые стыковочные механизмы)

627   4  

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

    Ничего не найдено.