【C#/WPF】限制GridSplitter分隔栏的滑动范围
2023-09-11 14:22:26 时间
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/
相关文章
- C# 进制转换的实现(二进制、十六进制、十进制互转)
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
- C#订阅与发布标准实现 visual studio code .net 开发 设计模式之☞策略模式 C#字符串转二进制、二进制转字符串 c# 接口的协变和逆变 c# 使用迭代器来创建可枚举类型 博客园首页新随笔联系订阅管理 随笔 - 117 文章 - 0 评论 - 57 c# 创建,加载,修改XML文档
- [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?
- 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- 演练:我的第一个 WPF 桌面应用程序 https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/getting-started/walkthrough-my-first-wpf-desktop-application
- 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
- C# Window编程随记——ClickOnce程序部署
- c# Datagridview 设置单位格为编辑状态(in editing mode)
- C#,图论与图算法,计算图(Graph)的岛(Island)数量的算法与源程序
- C#,图论与图算法,无向图(Graph)回环(Cycle)的不相交集(disjoint)或并集查找(union find)判别算法与源代码
- c# 引用参数-ref
- c# 引用与对象举例
- C#学习之获取时间戳
- C# Timer 的区别
- csharp C#数字字符串排序orderby的问题解决
- C# 多线程学习系列二
- C# 合并两个不同类型集合数据
- C# DataGridView:为行头添加行号
- 【C#/WPF】调节图像的对比度(Contrast)
- 【C#/WPF】.Net生成二维码QRCode的工具
- 【C#/WPF】用System.Timers.Timer计时器做浮窗广告
- 【C#/WPF】窗体定时自动关闭
- 【WPF/C#】使用BackgroundWorker实现多线程/异步操作
- 【WPF/C#】联网异步获取二进制文件(如图片)的流程
- 【WPF】XAML引入资源和在C#代码中动态添加样式
- c#代码规则,C#程序中元素的命名规范