初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客

C#是我多年以来的业余爱好,新搞的东西能用C#的就用C#了。


        WinUI3里面有个SplitView,实现了两块面板,但是是不带鼠标拖动改变大小的功能的,其设计目标不是两块面板,而是根据需要隐藏一个面板。

        一般来说,移动设备上确实不需要用户改变界面比例,但是你是WinUI3啊。所以说微软脑子里都是些什么啊,不如大家都散了算了。

        因为写Winforms程序的时候我非常依赖手动调整界面比例,对于不能自主调整的完全不能忍,所以,我必须实现一个SplitPanel。

目录

一、设计SplitPanel的基本原理

二、编写xaml

三、处理鼠标事件

3.1 初始化

3.2 鼠标事件

四、效果


一、设计SplitPanel的基本原理

        通过鼠标改变界面大小的功能总是涉及到这些技术:

  • 动态设置控件/窗口的位置和尺寸,当然这没什么难度
  • 处理鼠标事件,根据鼠标位置计算鼠标移动的距离,从而改变界面比例
  • 捕获鼠标,为什么需要捕获鼠标?因为鼠标移出控件/窗口之后就无法获得鼠标事件,这样能实现缩小但是无法实现变大。而捕获鼠标就是告诉操作系统即使鼠标移出也仍然要发送鼠标事件

        结合以上几点,一般实现鼠标改变界面大小的实现方法是:

  • 在鼠标按下时记录鼠标位置,捕获鼠标
  • 在鼠标移动时根据鼠标移动距离改变界面大小
  • 在鼠标释放时停止捕获鼠标

        在WinUI3里面我们可以借助Grid来实现:

左面板分隔条右面板

        分隔条用Border就可以了,宽度2-3像素,1个像素很难点击,7、8个像素又太粗壮不好看。

        左面板、右面板任意。

二、编写xaml

		<Grid><Grid.ColumnDefinitions><ColumnDefinition Width="3*" x:Name="col_mainlist" /><ColumnDefinition Width="3" /><ColumnDefinition Width="1*"  x:Name="col_preview" /></Grid.ColumnDefinitions><!-- 主列表 --><controls:DataGrid Grid.Column="0" x:Name="MainDataList" BorderBrush="Black" BorderThickness="1" Margin="2" Padding="2"Height="Auto" Background="LightGray"GridLinesVisibility="All" HorizontalGridLinesBrush="Blue" VerticalGridLinesBrush="Green" AutoGenerateColumns="True" /><!-- 分隔条 --><Border Grid.Column="1" x:Name="border_split" BorderBrush="Gray" BorderThickness="3" Margin="0,2,0,2" /><!-- 预览区 --><Grid Grid.Column="2" BorderBrush="Black" BorderThickness="1" Margin="2" Padding="2">。。。。。。</Grid></Grid>

         这个Grid只有一行,所以没有定义行。有三个列,分别对应左面板、分隔条、右面板。分隔条固定为3个像素,左面板和右面板为3:1分配。左面板是DataGrid,右面板是个子Grid。

        左右面板都有x:Name,因为我们需要同时改变左右面板的大小。你说改变DataGrid和子Grid的大小,让总Grid自适应行不行?这种自适应的东西很诡异,我是不太放心的。

        用作分隔条的Border上也有x:Name,我们设置鼠标事件都在它上面。

        这段xaml中的主列表和预览区是我实际的内容,和要实现的SplitPanel功能没有任何关系。

三、处理鼠标事件

3.1 初始化

			//设置拖动手柄border_split.PointerPressed += OnPointerPressed;border_split.PointerReleased += OnPointerReleased;

        在窗口的构造函数里增加上述代码。为什么没有设置PointerMoved事件?因为没有按下鼠标的时候处理PointerMoved是没有意义的。

3.2 鼠标事件

		private void OnPointerMoved(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e){FrameworkElement? control = sender as FrameworkElement;if (null == control) return;try{foreach (var pointer in control.PointerCaptures){//control.PointerCaptures.Contains(e.Pointer)是无效的,必须用PointerId来比较if (pointer.PointerId== e.Pointer.PointerId){ChangeControlSize(control, e);}}}catch (Exception ex){_ = ShowMessageBox(ex.Message, "Exception");}}private void OnPointerReleased(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e){FrameworkElement? control = sender as FrameworkElement;if (null == control) return;try{foreach (var pointer in control.PointerCaptures){//control.PointerCaptures.Contains(e.Pointer)是无效的,必须用PointerId来比较if (pointer.PointerId == e.Pointer.PointerId){control.PointerMoved -= OnPointerMoved; ;this.Title = "PointerReleased";control.ReleasePointerCapture(e.Pointer);}}}catch (Exception ex){_ = ShowMessageBox(ex.Message, "Exception");}}private void OnPointerPressed(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e){FrameworkElement? control = sender as FrameworkElement;if (null == control) return;if (!control.CapturePointer(e.Pointer)){this.Title = "CapturePointer error";return;}control.PointerMoved += OnPointerMoved; ;pos = e.GetCurrentPoint(control).Position.X;this.Title = "PointerPressed " + pos.ToString() + " - " + control.ActualWidth.ToString()+ " control.PointerCaptures "+ control.PointerCaptures.Count.ToString();}double pos = 0;private void ChangeControlSize(FrameworkElement? control, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e){if (null == control) return;double move = e.GetCurrentPoint(control).Position.X - pos;if (move >= 0){if (col_preview.ActualWidth - move < 0) return;}else{if (col_mainlist.ActualWidth + move < 0) return;}col_preview.Width = new GridLength(col_preview.ActualWidth - move);col_mainlist.Width = new GridLength(col_mainlist.ActualWidth + move);}

        这段代码还是比较严谨的,左右面板的名字可以随意替换。唯一不太严谨的是记录鼠标初始位置的pos,一般不建议全局变量用这样简单的方式命名。

        这个代码里面有一部分没有完善处理:假设了只有一个鼠标,但仍然判断了是否正在进行鼠标捕获(根据这个假设和鼠标按下才处理鼠标移动,并不需要检查是否是正在捕获的鼠标)。严谨的方式是根据鼠标ID来分别处理,设想,如果有两个鼠标同时操作会怎么样?

        处理是否是正在捕获的鼠标的时候遇到了一个坑,我已经在代码里指出。并不能简单地用鼠标对象是否在集合中来判断,必须一个一个比较ID。

        这段代码只处理了宽度,如果要做纵向的,稍微修改就可以了。

四、效果

        差不多就是这个意思了。当然,最好能把鼠标改成专门的鼠标形状。

 


(这里是文档结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85886.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85886.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85886.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面板数据】上市公司投资者保护指数(2010-2023年)

上市公司投资者保护指数是基于上市公司年报中公开披露的多项内容&#xff0c;从信息透明度、公司治理结构、关联交易披露、控股股东行为规范等多个维度&#xff0c;评估企业是否在制度上和实际操作中有效保障投资者&#xff0c;特别是中小投资者的合法权益。本分享数据基于我国…

如何解决USB远距离传输难题?一文了解POE USB延长器及其行业应用

在日常办公、教学、医疗和工业系统中&#xff0c;USB接口设备扮演着越来越关键的角色。无论是视频采集设备、键盘鼠标&#xff0c;还是打印机、条码枪&#xff0c;USB早已成为主流连接标准。然而&#xff0c;USB原生传输距离的限制&#xff08;通常在5米以内&#xff09;常常成…

PostgreSQL(TODO)

(TODO) 功能MySQLPostgreSQLJSON 支持支持&#xff0c;但功能相对弱非常强大&#xff0c;支持 JSONB、索引、函数等并发控制行级锁&#xff08;InnoDB&#xff09;&#xff0c;不支持 MVCC多版本并发控制&#xff08;MVCC&#xff09;&#xff0c;性能更好存储过程/触发器支持&…

LINUX 623 FTP回顾

FTP 权限 /etc/vsftpd/vsftpd.conf anonymous_enableNO local_enableNO 服务器 .20 [rootweb vsftpd]# grep -v ^# vsftpd.conf anonymous_enableNO local_enableYES local_root/data/kefu2 chroot_local_userYES allow_writeable_chrootYES write_enableYES local_umask02…

leetcode:77. 组合

学习要点 学习回溯思想&#xff0c;学习回溯技巧&#xff1b;大家应当先看一下下面这几道题 leetcode&#xff1a;46. 全排列-CSDN博客leetcode&#xff1a;78. 子集-CSDN博客leetcode&#xff1a;90. 子集 II-CSDN博客 题目链接 77. 组合 - 力扣&#xff08;LeetCode&#x…

自定义主题,echarts系列嵌套

自定义主题&#xff0c;echarts系列嵌套&#xff0c;完善map地图系列与lines系列抛物线 自定义主题开发设计&#xff08;如传感器数据可视化&#xff09; 1.使用typetreemap自定义 TreeMap 主题&#xff08;矩形树图系列&#xff09; 2.在矩形树图中画typelines动态连线和typee…

速度与精度的结合:Faster R-CNN模型的性能剖析

目标检测作为计算机视觉领域的核心问题之一&#xff0c;其重要性随着深度学习技术的发展而日益凸显。本文深入探讨了基于深度学习的Faster R-CNN模型&#xff0c;这是一种革命性的目标检测框架&#xff0c;它通过引入区域提议网络&#xff08;Region Proposal Network, RPN&…

计算机网络--期末速通版

以下总结提纲来自于hcgg&#xff0c;伟大无需多言。socket编程没有写进去&#xff0c;Rdt的话我后来感觉可能只考概念&#xff0c;其余我感觉会考的部分都在里面了&#xff0c;如果有错误或者解释不清楚造成的疑问&#xff0c;希望大家及时指正&#xff0c;感谢。 应用层 DNS…

AI浪潮拐点:MCP与A2A协议如何重塑AI智能体协作生态

一、AI技术演进的必然拐点:从单机智能到群体协作 当AI技术从单模型推理迈向复杂系统协作,MCP(模型协作协议)与A2A(智能体间协作协议)的诞生标志着产业变革的关键转折点。这一演进并非偶然,而是技术发展与社会需求双重驱动的必然结果。 从技术脉络看,AI正经历从"…

Python pyecharts基础(一)

pyecharts 安装 pip安装 pip(3) install pyecharts源码安装 $ git clone https://github.com/pyecharts/pyecharts.git $ cd pyecharts $ pip install -r requirements.txt $ python setup.py install # 或者执行 python install.py查看版本 import pyecharts print(pyecha…

【论文阅读】人工智能在直升机航空电子系统中的应用

人工智能在直升机航空电子系统中的应用 论文摘要文章结构参考文献 论文摘要 论文摘要:在现代战争形势日趋信息化、智能化的背景下&#xff0c;将人工智能应用于武器装备已经是大势所趋。针对直升机飞行任务的特征&#xff0c;对其发展状况进行了描述&#xff0c;并对其作业能力…

矩阵阶数(线性代数) vs. 张量维度(深度学习):线性代数与深度学习的基石辨析,再也不会被矩阵阶数给混淆了

文章目录 前言第一部分&#xff1a;重温矩阵阶数 - 方阵的专属标签第二部分&#xff1a;深入张量维度 - 深度学习的多维容器第三部分&#xff1a;核心区别总结第四部分&#xff1a;在深度学习中为何混淆&#xff1f;如何区分&#xff1f;结论 前言 在线性代数的殿堂里&#xf…

渗透测试指南(CSMSF):Windows 与 Linux 系统中的日志与文件痕迹清理

目录 &#x1f575;️‍♂️ 一、清理日志的重要性 核心目标 案例&#xff1a;域控渗透后日志暴露 &#x1f5a5;️ 二、Windows系统日志清理 1. 事件日志&#xff08;Event Logs&#xff09; 2. Web日志&#xff08;IIS Logs&#xff09; 3. PowerShell日志 4. 其他日…

MYSQL数据库和MSSQL数据库有什么区别?如何进行备份和还原?

MySQL 和 MSSQL 是两种广泛使用的关系型数据库&#xff0c;但它们在架构、功能、性能、平台支持以及使用场景等方面存在许多差异。以下是详细的区别&#xff0c;以及两者的备份和还原方法。 1. MySQL 与 MSSQL 的区别 1.1 基本概念 数据库MySQLMSSQL开发者Oracle&#xff08;…

vscode搭建spring boot项目

一.创建项目 第一步&#xff1a;打开vscode按下shiftctrlp,选择下面的 第二步&#xff1a;选择版本 第三步&#xff1a;选择语言 第四步&#xff1a;填写项目的Groupid 第五步&#xff1a;填写Artifact id 第六步&#xff1a;选择打包方式 第七步&#xff1a;选择java版本 第…

Matter协议开发者指南:使用Matter SDK构建智能家居应用

更新请关注&#xff1a;Matter协议开发者指南&#xff1a;使用Matter SDK构建智能家居应用 智能家居的演变从根本上改变了我们日常生活中与技术互动的方式。从语音助手到自动化照明和安防系统&#xff0c;机遇似乎无穷无尽。然而&#xff0c;开在这个迅速扩张的领域中&#xff…

中科院1区TOP|IF8.3:广西中医药大学团队采用代谢组学-网络药理学整合策略,阐明鸡骨草的多靶点作用机制

中科院1区TOP|IF8.3&#xff1a;广西中医药大学团队采用代谢组学-网络药理学整合策略&#xff0c;阐明鸡骨草的多靶点作用机制 在当今生命科学研究领域&#xff0c;代谢性疾病的防治与传统中药的现代化研究已成为两大备受瞩目的热点方向。随着全球范围内脂质代谢紊乱相关疾病发…

c++中 Lambda表达式

Lambda优化技巧 尽量使用值捕获简单类型 避免捕获大型对象(使用引用或智能指针) 将不修改的捕获标记为const 使用初始化捕获移动语义资源 前言 1. Lambda表达式基本语法 [捕获列表](参数列表) mutable(可选) 异常属性(可选) -> 返回类型(可选) {// 函数体 } 捕获列表…

睿是信息携手Arctera,深化服务中国市场,共筑数据管理新未来

2025年6月23日&#xff0c;为了更加深入服务中国大陆地区的广大用户&#xff0c;上海睿是信息科技有限公司&#xff08;以下简称“睿是信息”&#xff09;与全球数据管理领域的领导者Arctera&#xff0c;双方正式达成战略合作&#xff0c;自2025年7月7日起&#xff0c;睿是信息…

【WebGIS系列】WebGIS 开发相关的资源

目录 数据 GIS 软件 地图渲染库 EPSG 相关工具 资源 以下为个人收集的与 WebGIS 开发相关的资源&#xff08;排名不分前后&#xff09;&#xff0c;欢迎补充。 数据 天地图(opens in a new tab)国家统计局行政区划(opens in a new tab)民政部全国行政区划信息查询平台(…