给定下面的XAML,如何使网格分割器尊重分配给第三行的MinHeight并使内容保留在我的窗口内?

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition MinHeight="40" />
    </Grid.RowDefinitions>
    <Expander Grid.Row="0" ExpandDirection="Down" VerticalAlignment="Top">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" MinHeight="40" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Border Grid.Row="0" MinHeight="100" Background="Black" />
            <GridSplitter Grid.Row="1" Height="5" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Background="LightBlue" ResizeBehavior="PreviousAndCurrent" />
        </Grid>
    </Expander>
    <Expander Grid.Row="1" ExpandDirection="Down" VerticalAlignment="Top">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" MinHeight="40" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Border Grid.Row="0" MinHeight="100" Background="Black" />
            <GridSplitter Grid.Row="1" Height="5" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Background="LightBlue" ResizeBehavior="PreviousAndCurrent" />
        </Grid>
    </Expander>
    <Border DockPanel.Dock="Bottom"  Grid.Row="2" Background="Lime" MinHeight="30" >
        <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DockPanel},Path=ActualHeight,StringFormat={}{0:f0}}" />
    </Border>
</Grid>

最佳答案

按照您的代码方式,不能完成配对。这是由于GridSplitter的工作方式。

几点

  • GridSplitter将始终在直接相邻的行/列上工作
  • 实际上,您的MinHeight被尊重,但是GridSplitter的增长要求也得到尊重,这导致Grid的增长大于Window的
  • 调整大小为“自动”时,行/列将始终根据其内容调整大小,而不是更大和更小
  • 因此,如果将GridSplitter夹在两个*大小的行/列之间,则它将隐式地尊重您的MinHeight,因为实际上,它不会碰它

  • 您有一些解决方案
  • 在第3个位置添加*大小的另一行,并使边框位于第3行,并且RowSpan为2(因此,第3行是真正调整大小的行,第4行没有被触及。尽管这也会有副作用。
  • 处理GridSplitter上的DragEnter和PreviewMouseMove事件的混合物,跟踪焦点,并在达到特定大小时取消(e.Handled = true)事件。

  • 这是我能想到的伴侣,希望我能有所帮助。

    10-04 10:54