使用“自动高度/宽度”时,拖动GridSplitter会导致单元格增大

时间:2010-09-30 07:32:18

标签: wpf gridsplitter

我正在使用GridSplitter来调整网格中的单元格,但是它的行为不是我所期望的,我找不到解决方案。它是一个包含三行的网格,第一行的行定义设置为Auto并包含一些元素。第二行包含一些数据,行的定义为*以填充剩余空间。最后一行是需要调整大小的状态栏,因此其中包含一个网格分割器,并且行定义高度Auto和MinHeight为30。

问题是当你将GridSplitter一直拖到顶部时,它会使单元溢出。我希望它一旦达到顶峰就停止。通过从最后一行中删除Height = Auto可以实现所需的行为,但这会使底部单元格与中间行扩展为相等的高度。

这是一个XAML Pad示例。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" MinHeight="20" />
            <RowDefinition Height="Auto" MinHeight="30" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="Foo" />
        <TextBlock Grid.Row="1" Text="Bar" />
        <GridSplitter  Canvas.ZIndex="1"  VerticalAlignment="Top"  Grid.Row="2" Background="Cyan" Height="5" HorizontalAlignment="Stretch"  />
        <TextBlock VerticalAlignment="Bottom" Grid.Row="2" TextWrapping="Wrap">LOL<LineBreak/>LOL<LineBreak/>LOL</TextBlock>
    </Grid>
</Page>

当您向上拖动时,您会注意到底部文字消失。

我尝试了各种各样的东西,例如将网格分割器放在自己的单元格中,将Bights Height绑定到另一个对象ActualHeight等,但没有一个真正有效。

我知道这不是解释得最好的问题,但任何想法都会受到高度赞赏。

修改 我已经在GridSplitter中创建了自己的行,如下所示,但正如我之前提到的,问题仍然存在。我还在这里设置了ResizeBehavior和ResizeDirection。

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" MinHeight="20" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" MinHeight="30"  />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="Foo" />
        <TextBlock Grid.Row="1" Text="Bar" />
        <GridSplitter ResizeDirection="Rows" ResizeBehavior="PreviousAndNext" Grid.Row="2" Background="Cyan" Height="5" HorizontalAlignment="Stretch"  />
        <TextBlock VerticalAlignment="Bottom" Grid.Row="3" TextWrapping="Wrap">LOL<LineBreak/>LOL<LineBreak/>LOL</TextBlock>
    </Grid>
</Page>

一个例子是什么工作是删除最后一行Height =“Auto”并将其更改为*就像这样                                                                                              

然而,这使得最后一行的大小等于它之前的行,而不是所请求的单元格大小。

2 个答案:

答案 0 :(得分:3)

GridSplitter应该位于自己的行或列中。试用GridSplitter.ResizeDirectionGridSplitter.ResizeBehavior属性。

看看以下文章:

<强>更新

您可以向GridLength对象提供“星系数”。例如:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">   
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="95*" MinHeight="20" /> <!--here we are using 95*-->
            <RowDefinition Height="Auto" />
            <RowDefinition Height="5*" MinHeight="30"/> <!--and here we are using 5*-->     
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="Foo" />
        <TextBlock Grid.Row="1" Text="Bar" />
        <GridSplitter ResizeDirection="Rows"  Grid.Row="2" Background="Cyan" Height="5" HorizontalAlignment="Stretch"  />
        <TextBlock VerticalAlignment="Bottom" Grid.Row="3" TextWrapping="Wrap">LOL<LineBreak/>LOL<LineBreak/>LOL</TextBlock>
    </Grid> 
</Page>

因此,我们可以根据需要设置布局,而GridSplitter行为不明确。

答案 1 :(得分:1)

不,打败了我。我不妨发布我所拥有的内容。您的问题是第三行定义。当您开始向上滚动并且文本消失时,行的高度不断增加。如果Eugene的解决方案不起作用,您可以尝试将最大高度设置为某个限制。