WPF二合一平板电脑上屏幕旋转时获取屏幕宽高问题

news/2025/9/22 19:22:42/文章来源:https://www.cnblogs.com/panwangvie/p/19105885

在二合一平板上面,屏幕旋转之后,屏幕的宽高会被改变,如果代码里面有用到屏幕宽高的地方可能会出错。

获取屏幕宽高位置可以通过可以通过如下几种方式获取

/// <summary>/// 获取屏幕大小 /// </summary>public void InitScreenSize(){var primaryScreen = Screen.PrimaryScreen;// 获取主屏幕边界var screenBounds = primaryScreen.Bounds;var  screenWidth = screenBounds.Width;var screenHeight = screenBounds.Height;var screenWidth = SystemParameters.PrimaryScreenWidth;var screenHeight = SystemParameters.PrimaryScreenHeight;var Width = SystemParameters.WorkArea.Width;var Height = SystemParameters.WorkArea.Height;}

现在问题是,如果一开始初始化界面就获取屏幕宽高,正常是1920x1080的,屏幕旋转到竖屏之后就会变成1080x1920了。

如何动态适配呢。可以通过如下SimpleOrientationSensor 方式监听屏幕的旋转变化。

  internal class OrientationManager{#region 监听方向变化private SimpleOrientationSensor simpleSensor;private SimpleOrientation currentOrientation;/// <summary>/// 监听方向变化重启应用/// </summary>public void RegisterOrientationChanged(){try{if (simpleSensor != null){simpleSensor.OrientationChanged -= SimpleSensor_OrientationChanged;}simpleSensor = SimpleOrientationSensor.GetDefault();AnnotatorService.Log.Info($"初始化方向传感器:{simpleSensor != null}");if (simpleSensor != null){currentOrientation = simpleSensor.GetCurrentOrientation();// 订阅方向变化事件simpleSensor.OrientationChanged += SimpleSensor_OrientationChanged;CheckSensorStatus();}}catch (Exception e){AnnotatorService.Log.Error(e);}}public void UnregisterOrientationChanged(){if (simpleSensor != null){simpleSensor.OrientationChanged -= SimpleSensor_OrientationChanged;simpleSensor = null;}}public Action<SimpleOrientation> OnDelayOrientationChanged;private void CheckSensorStatus(){try{// 定期检查传感器状态var timer = new System.Threading.Timer(_ =>{if (simpleSensor != null){var current = simpleSensor.GetCurrentOrientation();var hasChanged = currentOrientation == current;AnnotatorService.Log.Debug($"定时获取传感器当前方向: {current},是否变化:{hasChanged}");}}, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(30));}catch (Exception ex){AnnotatorService.Log.Error($"传感器状态检查失败: {ex.Message}");}}private async void SimpleSensor_OrientationChanged(SimpleOrientationSensor sender, SimpleOrientationSensorOrientationChangedEventArgs args){AnnotatorService.Log.Info($"方向变化:{args.Orientation}");if (currentOrientation == args.Orientation) return;currentOrientation = args.Orientation;if (IsSignificantOrientationChange(currentOrientation)){await Task.Delay(300);OnDelayOrientationChanged?.Invoke(args.Orientation);}return;if (MainWindowManger.MainWindow != null) return;var exePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "H3CAnnotator.exe");if (File.Exists(exePath)){AnnotatorService.Log.Info($"关闭应用重启");Process.Start(exePath);//方向变化重启}}private bool IsSignificantOrientationChange(SimpleOrientation newOrientation){// 过滤掉不重要的方向变化// 例如:Faceup/Facedown 可能不需要处理switch (newOrientation){case SimpleOrientation.Faceup:case SimpleOrientation.Facedown:return false;default:return true;}}#endregion}

SimpleOrientationSensor 监听之后发现2个问题:

1.在触发方向变化立即获取屏幕宽高错误获取到的还是旋转前的宽高。由于触发旋转变化之后需要等待一会屏幕旋转好了之后再获取才正确。

2.旋转好了之后等待200ms再获取屏幕宽高是正常的,但是这个OrientationChanged 事件存在失效的情况,目前还不清楚为什么有时候用一会就事件没触发了,还未定位到原因。

未来解决在代码里面获取屏幕宽高的获取错误的情况,做了如下处理。

在获取宽高的地方直接调用获取宽高,不要进行首次初始化这类的缓存操作。

建议检测代码里面获取屏幕宽高或者是任务栏宽高,工作区域宽高的位置是否有进行缓存处理,需要都改为实时获取。

获取主屏幕分辨率的过程耗时极短,通常在微秒级别。没有必要缓存,即使上万次获取也是极端。

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

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

相关文章

以橙色为主的网站上海网页设计公司哪儿济南兴田德润有活动吗

SpringBootAdmin监控原理Actuator&#xff0c;自定义指标 文章目录 SpringBootAdmin监控原理Actuator&#xff0c;自定义指标actuator自定义info端点信息自定义Health端点信息自定义metrics端点信息端点的自定义 actuator JMX方式就是在cmd控制台输入jconsole&#xff0c;会弹出…

asp.net 制作网站教程推销产品怎么推广

前言 今天看到群里有人问”用matlab输出测试集的精度“&#xff0c;瞎试了一下&#xff0c;好像还成功了。主要还是依据前面所有在matlab中操作caffe的博客。 这里说一下&#xff1a;classification.m是适用单张图片的精度&#xff0c;类似于classification.exe的功能&#x…

衡水 网站开发wordpress 目录模板

正题 题目链接:https://www.51nod.com/Contest/Problem.html#contestProblemId1149 题目大意 nnn个数&#xff0c;求有多少种选择方案使选择的数乘机为kkk。 解题思路 显然kkk的质因数最多只有999个&#xff0c;我们将质因数进行dpdpdp。若选择的数的质因数刚好是kkk的质因数…

网站建设查看框架的源代码武威百度做网站多少钱

1.为啥主系统装了Ubuntu 由于公司发电脑了&#xff0c;我自己也有一台台式电脑&#xff0c;然后也想去折腾一下Ubuntu&#xff0c;就把自己的笔记本装成Ubuntu系统了&#xff0c; 我使用的是23.04的桌面版&#xff0c;带图形化界面的。我准备换回Windows 11了&#xff08;因为…

平面设计网站建设网站建设 宁夏

大家在使用Word邮件合并这个功能&#xff0c;比如制作席卡、贺卡、准考证、员工档案、成绩单、邀请函、名片等等&#xff0c;那就需要对图片路径进行转换处理&#xff0c;此脚本就是直接将图片的路径提取出来&#xff0c;并把内容放到txt格式的文本文档里&#xff0c;打开Excel…

怎么做公司网站需要什么科目应用公园是收费还是免费的

最小 API 并不是在 .NET 7 中才加入的&#xff0c;记得应该是在 .NET 6 中就已经提供&#xff0c;只是对我来说&#xff0c;到现在才开始使用。创建一个最小 API在 VS 2022 中创建 WebAPI 项目&#xff0c;不勾选使用控制器&#xff0c;创建出来的就是最小 API &#xff1a;不勾…

官方网站营销网站开发获取用户微信号登录

自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素&#xff0c;让Spring自动识别如何装配Bean的依赖关系。 自动检测(autodiscovery)比自动装配更进了一步&#xff0c;让Spring能够自动识别哪些类需要被配置成Spring Bean&#xf…

实战:Android 自定义菊花加载框(带超时自动消失) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

公司英文网站多少钱WordPress极品主题

1背景 昨天,一朋友向我咨询Sybase ASE中定长字符串类型的行为,说他们的客户反映,同样的char类型的数据,通过jdbc来查,Sybase库不会带空格,而PostgreSQL会带。是不是这样的?他是PostgreSQL的专业大拿,但因为他手头没有现成的Sybase ASE环境,刚好我手上有,便于一试。 …

代码中的善意:构建人性化的软件开发文化

本文探讨软件开发中人性化沟通的重要性,强调代码审查时应关注代码质量而非人身攻击,通过具体对话示例展示如何以建设性方式提供反馈,最终实现更好的团队协作与软件质量。代码中的善意 软件开发从根本上说是关于人的…

超级恶心的题面 [USACO21OPEN] Portals G

这个东西我自己也不知道怎么精简,所以直接贴原题题面了。 题意 Bessie 位于一个由 \(N\) 个编号为 \(1\dots N\) 的结点以及 \(2N\) 个编号为 \(1\cdots 2N\) 的传送门所组成的网络中。每个传送门连接两个不同的结点 …

海口省建设厅网站广告拍摄制作公司

有这个想法的初衷喜欢电子和DIY硬件的朋友对稚晖君应该都不陌生&#xff0c;他定期都会分享一些自己做的好玩的硬件&#xff0c;他之前做了一个ElectronBot桌面机器人我就很感兴趣&#xff0c;所以就自己也做了一个。起初我只是自己开发了一个叫电子脑壳的上位机软件&#xff0…

服务类网站建设网站关闭了域名备案

目录 1.注册中心 1.1.nacos注册中心 1.2. 微服务注册和拉取注册中心的内容 2.3.修改订单微服务的代码 3.负载均衡组件 3.1.什么是负载均衡 3.2.什么是Ribbon 3.3.Ribbon 的主要作用 3.4.Ribbon提供的负载均衡策略 4.openfeign完成服务调用 4.1.什么是OpenFeign 4.2…

建设宣传网站的必要性建设商城网站公司吗

在机器人技术日新月异的今天&#xff0c;舵机作为机器人的核心部件之一&#xff0c;扮演着至关重要的角色。它的性能直接关系到机器人的运动控制、稳定性以及精度等方面。那么&#xff0c;在选择和使用机器人舵机时&#xff0c;我们需要关注哪些关键要素呢&#xff1f;本文将为…

北京市住房城乡建设门户网站温岭网络推广公司

mySelectDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

成立网站要什么手续城乡建设和住房建设官网

从2016年的3月份开始到现在&#xff0c;对于Android文档的翻译已经进行了两个月的时间。虽然数量还不及总篇数的一半&#xff0c;但是经过一番整理&#xff0c;发现翻译的文章还不少&#xff0c;目前为止已经有56篇了。这个过程也陆陆续续的坚持了下来。现在回头看刚开始翻译的…

网站缺陷和优化的例子中学加强校园网站内容建设

输入两个整数&#xff0c;求他们的最大公约数&#xff1a; 如果我们不用辗转相除法的话&#xff0c;两个整数的最大公约数&#xff0c;我们就可以定义一个整数为两个整数中最小的那个数&#xff0c;然后两个整数一起除我们新定义的整数&#xff0c;如果都除尽了&#xff0c;这…

怎么搭建局域网网站隐私页 wordpress

【0】README 0.1&#xff09; 本文描述转自 core java volume 1&#xff0c; 源代码为原创&#xff0c;旨在理解 java线程——什么是线程&#xff1f; 的相关知识&#xff1b; 0.2&#xff09;线程定义&#xff1a;一个程序可以执行多个任务&#xff0c;每一个任务成为线程&a…

崇左做网站公司如何建设公司的网站首页

作者&#xff1a;Erik Engheim译者&#xff1a;冬雨整理&#xff1a;陈思20 世纪 90 年代末&#xff0c;RISC 和 CISC 爆发了一场大战&#xff0c;自那以后&#xff0c;大家却说 RISC 和 CISC 的区别没那么重要了了。许多人表示&#xff0c;指令集也就那么回事&#xff0c;对 C…

如何隐藏一个元素

【常见方法对比】方法是否占据空间是否可交互是否触发重绘/回流典型场景display:none ❌ 不占空间 ❌ 不可交互 回流+重绘 完全移除元素(菜单切换、Tab 切换)visibility:hidden ✅ 占空间 ❌ 不可交互 重绘 保留布局…