Как сделать элементы в DockPanel расширяться, чтобы соответствовать всем доступным пространствам в WPF?
У меня есть StackPanel
, содержащий StackPanel
и некоторые другие элементы. Первая StackPanel
имеет вертикальную ориентацию, внутренняя имеет горизонтальную ориентацию. Внутренний имеет TreeView
и ListView
, я бы хотел, чтобы они расширялись и соответствовали ширине окна, которое я установил в окне, и разрешаю пользователю изменять. Мне также хотелось бы, чтобы внешний StackPanel
соответствовал высоте окна. Как это сделать?
Edit:
Я преобразовал в использование DockPanel
, и я правильно установил свойства DockPanel.Dock
в каждом из элементов и отключил LastChildFill
в обеих док-панелях, макет все еще не растягивается.
Код:
<Window x:Class="Clippy.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="400" Width="600" MinHeight="400" MinWidth="600" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged">
<DockPanel Name="wrapperDockPanel" LastChildFill="False">
<Menu Height="22" Name="mainMenu" Width="Auto" DockPanel.Dock="Top" />
<ToolBar Height="26" Name="mainToolBar" Width="Auto" DockPanel.Dock="Top" />
<DockPanel Height="Auto" Name="contentDockPanel" DockPanel.Dock="Top" LastChildFill="False">
<TreeView Name="categoryTreeView" />
<ListView Name="clipListView" />
</DockPanel>
<StatusBar Height="23" Name="mainStatusBar" DockPanel.Dock="Top" />
</DockPanel>
</Window>
Ответы
Ответ 1
Это должно быть сделано - я настроил его так, чтобы TreeView и ListView разделили основной вид 50/50; если вы этого не хотите, установите его в "Авто" и "*" или что-то еще. Используйте "LastChildFill" в ваших интересах!
<Window x:Class="Clippy.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="400" Width="600" MinHeight="400" MinWidth="600" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged">
<DockPanel LastChildFill="True">
<Menu Width="Auto" DockPanel.Dock="Top" />
<ToolBar Width="Auto" DockPanel.Dock="Top" />
<StatusBar DockPanel.Dock="Bottom" />
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*" />
<RowDefinition Height="0.5*" />
</Grid.RowDefinitions>
<TreeView Name="categoryTreeView" Grid.Row="0" />
<ListView Name="clipListView" Grid.Row="1" />
</Grid>
</DockPanel>
</Window>
Ответ 2
Вместо этого используйте DockPanel. StackPanel явно не заботится о видимом пространстве, тогда как DockPanel выполняет все вычисления размера на основе доступного пространства.
Update:
Кроме того, по моему опыту, поместив тело окна в представление, и только наличие в окне "Вид в окне" улучшает работу с Auto Size.
По какой-то причине размещение всех детей непосредственно в окне, похоже, не очень сильно зависит от размера.
Обновление 2:
Я бы удалил явный атрибут DockPanel.Dock из элемента, который вы хотите растянуть (заполнить) неиспользуемое пространство.
Ответ 3
Задайте значения ширины и высоты для "авто"