栅格切割器:将行高限制为窗口大小

时间:2013-05-31 07:18:02

标签: c# wpf resize grid gridsplitter

我刚刚开始尝试使用网格分析器,偶然发现了一个非常奇怪的行为,我似乎无法修复它。显然其他人也有类似的问题(根据谷歌),但没有有用的评论。

我有一个有2行的网格。在启动时,底部的Hight为250.顶行的剩余部分为*。当我使用拆分器调整行的大小时,行为与顶行的预期一致。但是当我向上拖动分割器并经过程序窗口时,底行的内容将从窗口中掉出(=向下移动直到它消失)。我希望我不能使每一行都大于父容器。

<Grid x:Name="grid_main" ScrollViewer.VerticalScrollBarVisibility="Disabled" >
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition MinHeight="250"  Height="250"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <GridSplitter x:Name="splitter" 
        ResizeDirection="Rows" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Width="Auto"
        Height="5" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="0" ResizeBehavior="BasedOnAlignment" />
    <Grid Grid.Column="0" Grid.Row="0">
    </Grid>
    <Grid Grid.Column="0" Grid.Row="1">              
    </Grid>
</Grid>

这是我的代码。两行的内容再次托管在网格中,并且为了简单起见已被删除。再次:调整顶行的工作正常。但是底行可以调整为无穷大。如果我对MaxHeight进行硬编码,它会按预期工作。但这取决于窗口大小。

3 个答案:

答案 0 :(得分:4)

尝试将第二个RowDefinition更改为以下内容:

<RowDefinition MinHeight="250" MaxHeight="{Binding ElementName=grid_main, Path=ActualHeight}" Height="250"/>

这将确保行高不超过窗口大小。

答案 1 :(得分:0)

Richard的解决方案对我不起作用(网格的ActualHeight扩展超过窗口大小以及行高)。

使用Snoop,我发现祖先ContentPresenter的ActualHeight没有增加。因此,下面的底行定义对我有用,但如果我在顶行或底行设置MinHeight时仍然会遇到问题:

<RowDefinition Height="430"
               MaxHeight="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=ActualHeight}"/>

答案 2 :(得分:0)

这个问题只发生在因为第二行有绝对高度。如果您确实想要绝对高度值,请尝试理查兹的解决方案。否则,也只需在第二行使用相对高度(例如 2*)。