【问题标题】:Dragging GridSplitter causes cell to grow when using Auto height/width使用自动高度/宽度时,拖动 GridSplitter 会导致单元格增长
【发布时间】:2011-04-19 05:22:23
【问题描述】:

我正在使用 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>

当你拖到顶部时,你会发现底部的文字消失了。

我尝试了各种方法,例如将网格拆分器放在它自己的单元格中,以及将高度绑定到另一个对象 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" 并将其更改为 * 像这样

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

【问题讨论】:

    标签: wpf gridsplitter


    【解决方案1】:

    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 不清楚的行为。

    【讨论】:

    • 感谢您的及时回复。我已经阅读了您发布的两篇文章,并注意到他们说网格拆分器与其他元素占据同一行是可以的,只要它是可见的(它是可见的)。不幸的是,即使在它自己的行中,它仍然存在同样的问题。我已经用 GridSplitter 行的 XAML 更新了问题。我尝试使用 ResizeDirection 和 ResizeBehavior 的所有选项,据我所知控制它调整哪些网格元素的大小,但是仍然会发生行高溢出。
    • 是的,如前所述,*不会导致高度过度扩展。我和我的同事花了一些时间来解决这个问题。当拆分器用于自动行定义时,它会将其更改为绝对 GridLength,这就是问题所在。因为它们是绝对的,所以网格拆分器没有理由不能继续扩展单元格。
    • 不幸的是,您的解决方案没有做 Auto 所做的事情,因为它将行推到最小高度(它允许在那里使用剩余的 5%),因此它只会显示前两个 ' LOL,而不是最后一个 LOL。这可能是所有可以简单地完成的事情,所以我很高兴将您标记为正确答案。我将要么实现一个子 GridSplitter 以在使用时计算出正确的星百分比,要么添加一个 LayoutUpdated 事件处理程序并更新 MaxHeight。谢谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多