C# 结合WPF扩展器和GridSplitter以及MinHeight

C# 结合WPF扩展器和GridSplitter以及MinHeight,c#,wpf,C#,Wpf,如何将GridSplitter和扩展器很好地结合起来,同时考虑GridSplitter上/下两个区域的MinHeight 例如: <Grid> <Grid.RowDefinitions> <RowDefinition Height="*" MinHeight="200" /> <!-- Main --> <RowDefinition Height="Auto" />

如何将
GridSplitter
扩展器
很好地结合起来,同时考虑
GridSplitter上/下两个区域的
MinHeight

例如:

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

A.
...
X
...
如果我省略了
扩展器
网格拆分器
工作良好,并且尊重两行定义的
最小高度

如果我省略了
GridSplitter
(并将第二个
MinHeight
移动到秒行定义),则
扩展器可以正常工作

但是当两者都使用时,
MinHeight
不受尊重,而
Expander
就不再有效了


是否有简单的修复方法?

行定义上设置一个触发器,根据扩展器状态更改
最小高度

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

A.
...
X
...

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

我将XAML粘贴到测试项目中,它似乎工作正常,使用拆分器可以调整两个控件的大小,然而,两者都不低于其最小高度。还有其他因素影响它吗?@Rachel我稍微更改了XAML示例,以使问题/期望的行为更清楚。当扩展器崩溃时,我希望第2行“消失”。当扩展器打开时,我希望拆分器调整第2行的大小,但不要使其太小。很好,但不幸的是,移动拆分器后折叠扩展器仍然无法重置第2行。(拆分器仍然可以调整折叠扩展器的行大小。)@Peter如果希望在行折叠时强制调整行的大小,请使用DataTrigger设置
MaxHeight
属性。在这种情况下,最简单的方法可能是反转触发器,并将默认属性设置器设置为扩展的大小写,而将触发器设置为折叠的大小写。如果需要,我可以更新我的示例。修复不匹配的
ElementName=parentExpander
/
x:Name=“MyExpander”后效果良好
扩展器
未展开时,同样的技术也可以很好地将
GridSplitter
可见性
设置为
折叠
。问题:即使拆分器达到最大高度,行内的控件仍会无限增长。