结合 WPF Expander 和 GridSplitter 以及 MinHeight



如何在尊重GridSplitter上方/下方两个区域MinHeight的同时,很好地组合GridSplitterExpander

例如:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" MinHeight="200" />    <!-- Main -->
        <RowDefinition Height="Auto" />                 <!-- GridSplitter -->
        <RowDefinition Height="Auto" />                 <!-- Expander -->
    </Grid.RowDefinitions>
    <ListBox>
      <ListBoxItem>A</ListBoxItem>
      <ListBoxItem>...</ListBoxItem>
    </ListBox>
    <GridSplitter Grid.Row="1" Height="3" HorizontalAlignment="Stretch" />
    <Expander Grid.Row="2" Header="Expander" IsExpanded="False">
      <ListBox MinHeight="150">
        <ListBoxItem>X</ListBoxItem>
        <ListBoxItem>...</ListBoxItem>
      </ListBox>
    </Expander>  
</Grid>

如果我省略ExpanderGridSplitter运行良好,并且尊重两行定义的MinHeight

如果我省略GridSplitter(并将第二个MinHeight移动到第二行定义(,则Expander运行良好。

但是当两者都使用时,MinHeight就不被尊重了,Expander就不再真正起作用了。

有没有简单的解决方法?

RowDefinition上设置一个触发器,该触发器根据扩展器状态更改MinHeight

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" MinHeight="200" />
        <!-- Main -->
        <RowDefinition Height="Auto" />
        <!-- GridSplitter -->
        <RowDefinition Height="Auto" >
            <RowDefinition.Style>
                <Style TargetType="{x:Type RowDefinition}">
                    <Setter Property="MinHeight" Value="150" /> <!-- Default MinHeight -->
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=MyExpander, Path=IsExpanded}" Value="False">
                            <Setter Property="MinHeight" Value="24" /> <!-- MinHeight when Collapsed -->
                            <Setter Property="MaxHeight" Value="24" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </RowDefinition.Style>
        </RowDefinition>
        <!-- Expander -->
    </Grid.RowDefinitions>
    <ListBox>
        <ListBoxItem>A</ListBoxItem>
        <ListBoxItem>...</ListBoxItem>
    </ListBox>
    <GridSplitter Grid.Row="1" Height="3" HorizontalAlignment="Stretch" />
    <Expander x:Name="MyExpander" Grid.Row="2" Header="Expander" IsExpanded="False">
        <ListBox>
            <ListBoxItem>X</ListBoxItem>
            <ListBoxItem>...</ListBoxItem>
        </ListBox>
    </Expander>
</Grid>

默认情况下,行的最小高度将为 150,但是当扩展器关闭时,它将最小和最大高度设置为 24(默认扩展器的高度(,强制其高度保持在最小值。

相关内容

最新更新