2010-01-20 4 views
3

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


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

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

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

    <ListView> 
    ... 
    </ListView> 
</DockPanel> 
+12

первое правило всех вопросов WPF, «Опубликуйте свой XAML» – keithwarren7

ответ

5

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

<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"/> 

Навигатор Row и календарь Row разделит доступное пространство, с календарем Роу с дважды высоту Навигатора Row. Вы поняли эту идею.

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

3

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

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

0

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

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

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

2

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

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

0

Используйте сетку WPF с настройками Widht и Height, настроенными с понятием «Число *». Например, Ширина = "0,6 *", которая не является абсолютной высотой, но пропорциональна отношению к контейнеру. Общее, если вы хотите изменить размер содержимого, избегайте фиксированных размеров, насколько это возможно.

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

Удачи.

1

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

Смежные вопросы