Wpf 当用户展开/折叠treeview时,如何使区域保持恒定/相对大小?

Wpf 当用户展开/折叠treeview时,如何使区域保持恒定/相对大小?,wpf,xaml,layout,treeview,Wpf,Xaml,Layout,Treeview,我有一个大小可变的窗口,当前为300 x 400,如下所示 在顶部,我有一个可展开的树状视图 在底部,我有一个长的水平面板,上面有一个按钮 我希望顶部区域(treeview)约为高度的95%,按钮工具区域的高度为常量50 我希望这些比例在用户展开和折叠树视图时保持不变(当它在按钮工具栏下方展开时,我希望viewscroller弹出一个滚动条 我如何才能做到这一点?这是目前为止我所能做的最好的事情,但是当用户折叠树状视图时,按钮区域会向上移动: <Window x:Class="TestSi

我有一个大小可变的窗口,当前为300 x 400,如下所示

在顶部,我有一个可展开的树状视图 在底部,我有一个长的水平面板,上面有一个按钮

我希望顶部区域(treeview)约为高度的95%,按钮工具区域的高度为常量50

我希望这些比例在用户展开和折叠树视图时保持不变(当它在按钮工具栏下方展开时,我希望viewscroller弹出一个滚动条

我如何才能做到这一点?这是目前为止我所能做的最好的事情,但是当用户折叠树状视图时,按钮区域会向上移动:

<Window x:Class="TestSize8383.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="400">
    <Window.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="True" />
        </Style>
    </Window.Resources>

    <DockPanel Background="Beige" Margin="3" LastChildFill="False">

        <ScrollViewer DockPanel.Dock="Top" Background="White" Margin="3">
            <TreeViewItem DockPanel.Dock="Top" Background="White" Header="Page 1" IsExpanded="True">

                <TreeViewItem Header="Part 1">
                    <TreeViewItem Header="Paragraph 1">
                        <TreeViewItem Header="Word 1"/>
                        <TreeViewItem Header="Word 2"/>
                    </TreeViewItem>
                    <TreeViewItem Header="Paragraph 2">
                        <TreeViewItem Header="Word 1"/>
                        <TreeViewItem Header="Word 2"/>
                    </TreeViewItem>
                    <TreeViewItem Header="Paragraph 3">
                        <TreeViewItem Header="Word 1"/>
                        <TreeViewItem Header="Word 2"/>
                    </TreeViewItem>

                    <TreeViewItem Header="Part 2">
                        <TreeViewItem Header="Paragraph 1">
                            <TreeViewItem Header="Word 1"/>
                            <TreeViewItem Header="Word 2"/>
                        </TreeViewItem>
                        <TreeViewItem Header="Paragraph 2">
                            <TreeViewItem Header="Word 1"/>
                            <TreeViewItem Header="Word 2"/>
                        </TreeViewItem>
                        <TreeViewItem Header="Paragraph 3">
                            <TreeViewItem Header="Word 1"/>
                            <TreeViewItem Header="Word 2"/>
                        </TreeViewItem>
                    </TreeViewItem>


                </TreeViewItem>
            </TreeViewItem>
        </ScrollViewer>

        <StackPanel DockPanel.Dock="Bottom" Background="Tan" Margin="3" Height="50">
            <Button Content="Previous" Margin="5"/>
        </StackPanel>

    </DockPanel>
</Window>

用网格代替DockPanel怎么样

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

    <ScrollViewer Grid.Row="0">
    ...
    </ScrollViewer>

    <StackPanel Grid.Row="1">
    ...
    </StackPanel>
</Grid>

...
...

根据您描述的固定布局,我将使用网格而不是DockPanel,如下所示:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="50" />
    </Grid.RowDefinitions>
    <ScrollViewer Grid.Row="0">
        <TreeView>
          <!-- items excluded for brevity -->
        </TreeView>
    </ScrollViewer>
    <StackPanel Grid.Row="1" Background="Tan" Margin="3">
        <Button Content="Previous" Margin="5" />
    </StackPanel>
</Grid>

您说过按钮的高度必须恒定在50左右,然后您立即谈论比例?我不确定我是否理解您的意思,但这是我目前为您准备的

  • 使DockPanel具有LastChildFill=True
  • 将StackPanel置于ScrollViewer上方(XAML代码中的第一个)
  • 使ScrollViewer具有VerticalScrollBarVisibility=“自动”
这将产生以下影响:

  • 按钮栏将始终可见
  • 当只需要滚动条时,滚动条将弹出视图