Как сделать элементы в DockPanel расширенными, чтобы соответствовать всему доступному пространству в WPF?

у меня есть StackPanel содержащий StackPanel и некоторые другие предметы. Первый StackPanel имеет вертикальную ориентацию, внутренняя имеет горизонтальную ориентацию. У внутреннего есть TreeView и ListView, Я хотел бы, чтобы они расширялись и соответствовали ширине окна, которое я установил в окне и позволил пользователю изменить. Я также хотел бы внешний StackPanel чтобы соответствовать высоте окна. Как мне это сделать?

Edit: Я перешел на использование DockPanel, и я установил DockPanel.Dock свойства правильно в каждом из элементов и инвалидов LastChildFill в обоих dockpanels макет по-прежнему не растягивается.

Код:

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

3 ответов


Это должно сделать это - я настроил его так, чтобы TreeView и ListView разделяли основной вид 50/50; если вы этого не хотите, установите его в "Auto" и " * " или что-то еще. Используйте "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>

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

обновление:

кроме того, по моему опыту, положить тело окна в вид, и только имея вид в окне делает для лучшего опыта авто размер.

по какой-то причине, помещая всех детей непосредственно в окно, кажется, не авто размер очень что ж.

обновление 2:

Я бы удалил явную DockPanel.Атрибут Dock из элемента, который вы хотите растянуть (заполнить) неиспользуемое пространство.


установите свойства ширины и высоты в "auto"