当前位置: 首页 > news >正文

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

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

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

/// <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.gsyq.cn/news/9779.html

相关文章:

  • 代码中的善意:构建人性化的软件开发文化
  • 9/22
  • Python开发中都遇到哪些问题,怎么解决的
  • 【废话】
  • 从 0 到 1,AI 走进服装店:记住每位顾客的喜好,比你还靠谱
  • 君子如水,心中有火:vivo本心而为30周年
  • Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物 - 指南
  • 第二次软工作业——个人项目 - LXJ
  • systemd服务自身重启策略管理
  • java log4j 代码中 新增按日保存日志文件的功能
  • Android 项目:画图白板APP开发(六)——分页展示 - 教程
  • mysql/oracle LEFT JOIN 取时间最大的数据
  • 基于遗传算法与非线性规划的混合优化算法在电力系统最优潮流中的实现
  • Java-如何在Eclipse开发-数组
  • 常用数据生成器
  • 鸿蒙项目实战(十):web和js交互
  • 函数计算进化之路:AI 应用运行时的状态剖析
  • 详细介绍:Day20 K8S学习
  • opencv学习记录3
  • 统计分析神器 NCSS 2025 功能亮点+图文安装教程
  • Gentoo安装配置
  • 3 网络基础知识+web基础知识+部署Server
  • 简单理解java虚拟机
  • 洛谷题单指南-进阶数论-P1516 青蛙的约会
  • electron中的几个概念
  • 保护眼睛小程序
  • 001_string操作
  • hbase 面试题
  • mall项目学习笔记
  • 存储多边形网格的文件格式:OBJ、FBX、RenderMan、glTF、USD 等。