Автоматическое изменение размера содержимого окна в WPF - PullRequest
3 голосов
/ 20 января 2010

При отладке моих WPF-программ я заметил, что когда окно имеет заданный размер, элементы управления выглядят просто отлично. Но когда окно развернуто, содержимое располагается в том же месте, как если бы размер окна не изменился. Я хочу, чтобы содержимое и окно изменяли размеры пропорционально. Как я могу это сделать? Извините, если это нубистский вопрос, но я немного новичок в эпоху WPF.


Код XAML еще не полностью готов, но вот некоторые элементы:

<DockPanel>
    <StackPanel DockPanel.Dock="Left">
    ...
    </StackPanel>

    <TabControl DockPanel.Dock="Right">
    ...
    </TabControl>

    <ListView>
    ...
    </ListView>
</DockPanel>

Ответы [ 6 ]

5 голосов
/ 20 января 2010

Обычно это происходит потому, что значения измерений устанавливаются статически, а не динамически. Вот статический подход:

<RowDefinition x:Name="NavigatorRow" Height="120"/>
<RowDefinition x:Name="TaskPanelRow" Height="80"/>

Обе строки будут иметь фиксированную высоту, и они не будут изменять размер с окном.

Вот динамический подход:

<RowDefinition x:Name="NavigatorRow" Height="1*"/> 
<RowDefinition x:Name="TaskPanelRow" Height="80"/>

Нижний ряд по-прежнему имеет фиксированную высоту 80, но верхний ряд будет расширяться, чтобы заполнить любое доступное пространство. Другими словами, строки изменят размеры с окном. Колонны работают так же.

Если бы у меня было три ряда, я мог бы сделать это:

<RowDefinition x:Name="NavigatorRow" Height="1*"/>
<RowDefinition x:Name="CalendarRow" Height="2*"/>
<RowDefinition x:Name="TaskPanelRow" Height="80"/>

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

Итак, вы используете не контейнер, а размер вашего контейнера. Единственное исключение, как отмечено выше, это StackPanel, который не масштабируется. Вместо этого используйте сетку, поскольку она масштабируется.

3 голосов
/ 20 января 2010

Обычно это происходит потому, что контент размещается в контейнере, который имеет явно заданную ширину и высоту, например, в Grid.

Опубликуйте свой Xaml, или этот ответ - лучшее, что вы получите!

2 голосов
/ 20 января 2010

Старайтесь не использовать StackPanels, они не изменяют динамический размер должным образом.

В идеале вы должны использовать сетку и указывать проценты, если вы хотите, чтобы размеры пропорционально изменялись.

1 голос
/ 20 сентября 2011

Не уверен, почему все говорят, что стековые панели не изменяют размер динамически.Они обрабатывают изменение размеров так же, как и сетки.Просто убедитесь, что вы установили свой HorizontalAlignment = "Stretch" (и / или VerticalAlignment), и содержимое будет расширяться, чтобы заполнить размер панели стека.В настоящее время я использую пользовательский интерфейс, который состоит из множества вложенных стековых панелей, горизонтальное и вертикальное изменение размеров окна расширяет / сжимает все элементы управления одинаково внутри окна.

0 голосов
/ 20 января 2010

Использовать сетку WPF со свойствами Widht и Height, установленными с понятием «Number *».Например, Width = "0.6 *" , что является не абсолютной высотой, а пропорциональным отношением к контейнеру.Как правило, если вы хотите изменить размер содержимого, по возможности избегайте свойств фиксированного размера.

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

Удачи.

0 голосов
/ 20 января 2010

Ну, у вас должен быть какой-то контейнер для ваших контролей, верно?Если вы используете Canvas и просто размещаете элементы управления внутри, вам не повезло;это не очень хорошо для масштабирования интерфейсов.

Тем не менее, существуют различные элементы управления контейнером, которые будут размещать то, что вы в них вставляете, определенным образом.И при правильном использовании они также масштабируются с помощью окна изменения размера.Сетка довольно гибкая, но StackPanel и DockPanel иногда очень удобны.

Вы можете вкладывать их, если вам нужно.

...