【C#/WPF】限制GridSplitter分隔栏的滑动范围

70 篇文章 5 订阅

GridSplitter可以自由滑动,例如一个水平方向的分隔栏,可以从屏幕顶端滑到屏幕底端。
现在的需求是:限制GridSplitter在一定范围内滑动。

例如,现在有如下的横竖两个GridSplitter分隔栏。

<Grid>
    <Grid.RowDefinitions/>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Row="0" Grid.Column="0" Text="LLLLLLLLLLLLLL"/>
    <GridSplitter Grid.Row="0" Grid.Column="1" Width="10" HorizontalAlignment="Center" VerticalAlignment="Stretch" Background="Wheat" DragDelta="GridSplitter_DragDelta"/>

    <Grid Grid.Row="0" Grid.Column="2">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="10"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Row="0" Grid.Column="0" Text="RRRRRRTTTTTTTT"/>
        <GridSplitter Grid.Row="1" Grid.Column="0" Height="10" HorizontalAlignment="Stretch" Background="Wheat"/>
        <TextBlock Grid.Row="2" Grid.Column="0" Text="RRRRRRBBBBBBBB"/>

    </Grid>
</Grid>

运行起来效果如下:
这里写图片描述

目标:

  • 尝试限制右侧的水平分隔栏的垂直方向滑动范围。

思路:

  • 之前一直是尝试动态获取右侧上下两个部分的Height或ActualHeight,并在分隔符的滑动事件中进行处理。
private void sculptMaterialTab_GridSplitter_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
    if () ....
}
  • 比如在初始化时先获得上下部分的默认高度,然后滑动中动态判断,超过临界值则禁止滑动。

  • 后来发现,MVVM下就算把右侧上下两部分分别用一个Grid进行包裹,也无法初始化时获得这两个Grid的正确高度。也许是因为MVVM的初始化数据要优先于界面渲染,导致此时获取的Height是NaN而ActualHeight为0。


后来谷歌后看到另一种思路:

  • 其实限制GridSplitter分隔栏的滑动范围,不是动态限制它两侧Grid的宽或高,而是应该限制它所在的Grid的RowDefinitions或ColumnDefinition的最小/最大宽或高!

给右侧上下两部分设置最小高度即可!

<Grid.RowDefinitions>
    <RowDefinition MinHeight="200"/>
    <RowDefinition Height="10"/>
    <RowDefinition MinHeight="200"/>
</Grid.RowDefinitions>

重要的参考:

https://blog.onedevjob.com/2012/01/16/gridsplitters-part-3-limiting-the-range-of-a-gridsplitter/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值