如果Grid行包含折叠元素,如何使WPF窗口可调整大小

时间:2017-07-10 13:32:41

标签: wpf xaml

我对可调整大小的WPF窗口的设计有疑问。 结果是窗口元素会自动调整大小,同时通过鼠标拖动来改变窗口的宽度和高度。

基本面板是Dockpanel,第一个元素是位于顶部的ToolBar。 然后是一个有两行的网格。 在每个行中都有一个带内部元素的DockPanel。 其中一些元素可以被Visibilty.Collapsed隐藏(这将由最终版本中的属性生成)。 出于测试目的,我在ToolBar之后有两个DockPanel,并且我已将XAML文件中第一个的可见性设置为Collapsed。 当我启动应用程序时,窗口似乎是正确的。

但是当我单击窗口底部以通过拖动更改高度时,第二个Dockpanel会变小,并且折叠的Dockpanel所在的位置会变得可见。

我做错了什么?

这是我的XAML:

<Window x:Class="WPFResizable.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPFResizable"
        mc:Ignorable="d"
        Title="MainWindow"
        SizeToContent="Height"
        Width="525">

    <DockPanel VerticalAlignment="Stretch" Background="AliceBlue">
        <Button DockPanel.Dock="Top" Height="40" Content="ToolBar"/>

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

            <DockPanel Grid.Row="0" Grid.Column="0" VerticalAlignment="Stretch" Visibility="Collapsed">
                <GroupBox Margin="5"
                          Header="Group 1">
                    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                        <TextBox Text="Test 1"
                                 MinWidth="400"
                                 MinHeight="100"
                                 Margin="5"/>
                    </ScrollViewer>
                </GroupBox>
            </DockPanel>

            <DockPanel Grid.Row="1" Grid.Column="0" VerticalAlignment="Stretch">
                <GroupBox Margin="5"
                          Header="Group 2">
                    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                        <TextBox Text="Test 2"
                                 MinWidth="400"
                                 MinHeight="100"
                                 Margin="5"/>
                    </ScrollViewer>
                </GroupBox>
            </DockPanel>
        </Grid>
    </DockPanel>
</Window>

1 个答案:

答案 0 :(得分:1)

如果我正确地理解了你想要做的事情,我认为这会做你想要的。

  1. VerticalAlignment="Stretch"对于Grid子项来说是多余的,如果只有一列,则不需要在子项上指定Grid.Column
  2. 您的第一个网格行had Height="*",无论其内容是否可见,都会占据网格高度的一半。我已经编写了一个带有触发器的样式,当其内容不可见时,该行会将该行的高度更改为Auto。这取决于行中只有一个元素,但由于你在那里有一个DockPanel,你似乎已经在思考这些问题了。

        

    <Grid DockPanel.Dock="Bottom">
        <Grid.RowDefinitions>
            <RowDefinition>
                <RowDefinition.Style>
                    <Style TargetType="RowDefinition">
                        <!-- 
                        Must set the default in a Setter instead of an attribute, or 
                        dependency property precedence will override the trigger
                        below. 
                        -->
                        <Setter Property="Height" Value="*" />
                        <Style.Triggers>
                            <DataTrigger 
                                Binding="{Binding Visibility, ElementName=TopChildPanel}"
                                Value="Collapsed"
                                >
                                <Setter Property="Height" Value="Auto" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </RowDefinition.Style>
            </RowDefinition>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
    
        <DockPanel x:Name="TopChildPanel" Grid.Row="0" Visibility="Visible">
            <GroupBox Margin="5"
                      Header="Group 1">
                <ScrollViewer 
                    HorizontalScrollBarVisibility="Auto" 
                    VerticalScrollBarVisibility="Auto">
                    <TextBox Text="Test 1"
                             MinWidth="400"
                             MinHeight="100"
                             Margin="5"/>
                </ScrollViewer>
            </GroupBox>
        </DockPanel>
    
        <DockPanel Grid.Row="1">
            <GroupBox 
                Margin="5"
                Header="Group 2">
                <ScrollViewer 
                    HorizontalScrollBarVisibility="Auto" 
                    VerticalScrollBarVisibility="Auto"
                    >
                    <TextBox 
                        Text="Test 2"
                        MinWidth="400"
                        MinHeight="100"
                        Margin="5"/>
                </ScrollViewer>
            </GroupBox>
        </DockPanel>
    </Grid>