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

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/

posted @ 2017-05-11 16:04  霍莉雪特  阅读(1035)  评论(1编辑  收藏  举报