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

来源:互联网 发布:迷宫生成算法 递归 编辑:程序博客网 时间:2024/05/21 11:27

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/

0 0
原创粉丝点击