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

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

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

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

88
задан ASh 6 October 2018 в 08:55
поделиться

3 ответа

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", будет аналогично сжимать свое содержимое в этом направлении.

Некоторые примеры контейнеров, которые не сжимают своих дочерних элементов:

  • ContentControls никогда не сжимают своих дочерних элементов (сюда входят Border, Button, CheckBox, ScrollViewer и многие другие)
  • Grid с одной строкой и колонкой
  • Grid со строками и колонками размера "*"
  • DockPanel не сжимает своего последнего ребенка
  • TabControl не сжимает свое содержимое

Некоторые примеры контейнеров, которые сжимают своих дочерних элементов:

  • StackPanel сжимается в направлении ориентации
  • Grid с размером строки или столбца "Auto" сжимается в этом направлении
  • DockPanel сжимает все дочерние элементы, кроме последнего, в направлении дока
  • TabControl сжимает свой заголовок (то, что отображается на вкладке)

3. Явная высота или ширина далее

Удивительно, сколько раз я вижу, как Grid или DockPanel задают явную высоту и ширину, например, так:

<Grid Width="200" Height="100">
  <Button Content="I am unnecessarily constrainted by my containing panel" />
</Grid>

В общем, вы никогда не захотите задавать явную высоту или ширину любой панели. Мой первый шаг при диагностике проблем с компоновкой - удалить все явные значения высоты или ширины, которые я могу найти.

4. Окно имеет SizeToContent, когда не должно

Когда вы используете SizeToContent, ваше содержимое сжимается до минимального размера. Во многих приложениях это очень полезно и является правильным выбором. Но если ваше содержимое не имеет "естественного" размера, то вы, вероятно, захотите опустить SizeToContent.

178
ответ дан 24 November 2019 в 07:30
поделиться

Вы можете делать все, что хотите, просто сказав DockPanel LastChildFill = "True" , а затем убедившись, что то, что вы хотите заполнить, на самом деле является последним дочерним элементом!

Grid - это чудовище макета, которое можно заставить делать все, что угодно, но DockPanel обычно является правильным выбором для самой внешней панели макета. Вот пример псевдокода:

<DockPanel LastChildFill="True">
    <MyMenuBar DockPanel.Dock="Top"/>
    <MyStatus DockPanel.Dock="Bottom"/>

    <MyFillingTabControl />
</DockPanel>
7
ответ дан 24 November 2019 в 07:30
поделиться

просто оберните элементы управления в сетку с двумя рядами. Сетка будет автоматически использовать все отведенное ей пространство, и вы можете определить, что строки будут занимать все оставшееся пространство, задав им высоту "*". Первый ряд в моем примере (Height="Auto") займет столько места, сколько нужно ленте. Надеюсь, это поможет.

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>

  <Ribbon Grid.Row="0" />

  <TabPage Grid.Row="1" />
</Grid>

Добавляя атрибут "Grid.Row=..." к дочерним элементам управления сетки, они получают назначение на строки сетки. Тогда сетка будет определять размеры дочерних элементов в соответствии с определениями строк.

5
ответ дан 24 November 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: