Ответ 1
Макет в WPF сильно зависит от родительского контейнера. Например, если вы создаете форму с метками и полями ввода, подумайте об использовании панели "Сетка". Элементы управления в WPF по умолчанию изменяют размер в соответствии с поведением макета родителя. Ниже приведен пример окна с двумя помеченными текстовыми полями и двумя кнопками, размер которых изменяется вместе с окном.
<Window>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Label Content="Contact Name" Grid.Row="0" Grid.Column="0" />
<TextBox Grid.Row="0" Grid.Column="1" />
<Label Content="Contact Location" Grid.Row="1" Grid.Column="0" />
<TextBox Grid.Row="1" Grid.Column="1" />
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
VerticalAlignment="Bottom" Grid.Row="2" Grid.Column="1">
<Button Content="OK" Width="75" Height="24" Margin="3" />
<Button Content="Cancel" Width="75" Height="24" Margin="3" />
</StackPanel>
</Grid>
</Window>
Или, если вам нужно что-то похожее на расположение адресной строки браузера, вы можете сделать что-то вроде:
<Window>
<DockPanel>
<DockPanel DockPanel.Dock="Top">
<Button Content="Back" DockPanel.Dock="Left" />
<Button Content="Forward" DockPanel.Dock="Left" />
<Button Content="Refresh" DockPanel.Dock="Right" />
<TextBox /> <!-- fill is assumed for last child -->
<DockPanel>
<StatusBar DockPanel.Dock="Bottom" />
<WebBrowser /> <!-- fill is assumed for last child -->
</DockPanel>
</Window>
Обратите внимание, что в приведенном выше примере я вложил два DockPanel. Это также могло быть достигнуто с помощью Grid, но разметка была бы намного более загромождена. Если вы новичок в WPF, я бы настоятельно предложил поиграть с различными доступными вам панелями. Когда вы узнаете, когда применять конкретную панель к определенному макету, это значительно упрощает работу с WPF.