Windows-universal-samples 之 SimpleOrientationSensor 示例:UWP 简易方向传感器的事件与轮询实战
示例工程【免费下载链接】Windows-universal-samplesAPI samples for the Universal Windows Platform.项目地址https://gitcode.com/gh_mirrors/wi/Windows-universal-samples点击查看免费下载本指南以 Windows-universal-samples 仓库中的 SimpleOrientationSensor 示例 为核心系统讲解 UWP 应用如何通过Windows.Devices.Sensors.SimpleOrientationSensor类获取设备简易方向未旋转、面朝上、逆时针旋转 90 度等。文中不仅完整还原官方示例的构建与运行步骤还结合仓库内 C# 与 C/CX 双语言源码深入剖析数据事件监听与轮询读取两种场景的完整实现、UI 线程调度与可见性处理细节帮助读者直接套用并二次开发自己的方向感应功能。示例概览与核心 APISimpleOrientationSensor简易方向传感器与需要三轴数据的 OrientationSensor 不同它返回的是离散的六个方向状态非常适合实现旋转屏幕提示设备翻转检测这类轻量级需求。本示例位于仓库的 Samples/SimpleOrientationSensor 目录官方描述为Shows how to use the Windows.Devices.Sensors.SimpleOrientationSensor class for a simple device orientation sensor.示例允许用户实时查看设备简易方向值并提供两种可选场景Orientation sensor data events数据事件注册OrientationChanged事件监听传感器方向变化时实时推送更新Polling orientation sensor readings轮询读取手动调用GetCurrentOrientation()获取当前方向快照。核心 API 位于Windows.Devices.Sensors命名空间关键成员如下成员类型说明SimpleOrientationSensor.GetDefault()静态方法获取系统默认方向传感器实例设备不支持时返回nullOrientationChanged事件方向变化时触发事件参数为SimpleOrientationSensorOrientationChangedEventArgs其Orientation属性携带新方向GetCurrentOrientation()方法同步读取当前方向轮询场景使用方向枚举SimpleOrientation的取值可从源码中的DisplayOrientation辅助方法Scenario1_DataEvents.xaml.cs完整看到NotRotated——未旋转Rotated90DegreesCounterclockwise——逆时针旋转 90 度Rotated180DegreesCounterclockwise——逆时针旋转 180 度Rotated270DegreesCounterclockwise——逆时针旋转 270 度Faceup——面朝上Facedown——面朝下其他情况统一显示为Unknown orientation。工程结构与双语言实现示例按语言分为两个独立子工程均包含相同的两个场景页面Samples/SimpleOrientationSensor/ ├── cpp/ # C/CXWindows Runtime C版本 │ ├── Scenario1_DataEvents.xaml / .cpp / .h │ ├── Scenario2_Polling.xaml / .cpp / .h │ ├── SampleConfiguration.h / .cpp │ ├── SimpleOrientationSensor.sln / .vcxproj │ └── Package.appxmanifest └── cs/ # C# 版本 ├── Scenario1_DataEvents.xaml / .xaml.cs ├── Scenario2_Polling.xaml / .xaml.cs ├── SampleConfiguration.cs ├── SimpleOrientationSensor.sln / .csproj └── Package.appxmanifest两个语言版本的场景入口由 SampleConfiguration.csC 侧对应SampleConfiguration.h/.cpp统一注册public const string FEATURE_NAME Simple Orientation Sensor; ListScenario scenarios new ListScenario { new Scenario() { Title Data Events, ClassType typeof(SimpleOrientationCS.Scenario1_DataEvents) }, new Scenario() { Title Polling, ClassType typeof(SimpleOrientationCS.Scenario2_Polling) } };清单文件 Package.appxmanifest 声明了Windows.Universal目标设备家族MinVersion为10.0.10240.0、MaxVersionTested为10.0.22621.0即面向 Windows 10 及以上版本的通用应用。场景一数据事件Data Events数据事件场景的界面Scenario1_DataEvents.xaml包含Enable / Disable两个按钮与一个方向输出TextBlock其说明文字为Registers an event listener for orientation changes and displays the new orientation as it is reported.获取传感器实例页面构造函数中调用静态工厂方法获取默认传感器并处理设备不支持的情况Scenario1_DataEvents.xaml.csprivate SimpleOrientationSensor _sensor; public Scenario1_DataEvents() { this.InitializeComponent(); _sensor SimpleOrientationSensor.GetDefault(); if (_sensor null) { rootPage.NotifyUser(No simple orientation sensor found, NotifyType.ErrorMessage); } }这是所有 UWP 传感器用法的标准模式先判空再使用。在没有方向传感器的设备如部分模拟器或台式机上运行会得到明确错误提示。注册与注销事件点击 Enable 后注册事件并立即显示一次当前方向Scenario1_DataEvents.xaml.csprivate void ScenarioEnable(object sender, RoutedEventArgs e) { if (_sensor ! null) { Window.Current.VisibilityChanged new WindowVisibilityChangedEventHandler(VisibilityChanged); _sensor.OrientationChanged new TypedEventHandlerSimpleOrientationSensor, SimpleOrientationSensorOrientationChangedEventArgs(OrientationChanged); ScenarioEnableButton.IsEnabled false; ScenarioDisableButton.IsEnabled true; // Display the current orientation once while waiting for the next orientation change DisplayOrientation(ScenarioOutput_Orientation, _sensor.GetCurrentOrientation()); } else { rootPage.NotifyUser(No simple orientation sensor found, NotifyType.ErrorMessage); } }两个实现细节值得注意注册事件的同时也调用GetCurrentOrientation()事件只在方向变化时触发因此先主动读取一次当前值避免按钮点击后界面一直停留在 No data同时注册Window.Current.VisibilityChanged当应用窗口不可见时注销传感器事件可见时重新注册见 VisibilityChanged 处理。源码注释明确指出不可见时注销事件可避免传感器数据引发非预期操作恢复可见后无需手动恢复reportInterval系统在应用恢复时会自动恢复。Disable 按钮反向操作同时注销两类事件并切换按钮可用状态Scenario1_DataEvents.xaml.cs。事件回调与 UI 线程调度OrientationChanged回调运行在后台线程必须通过Dispatcher编组到 UI 线程后才能更新TextBlockScenario1_DataEvents.xaml.csasync private void OrientationChanged(object sender, SimpleOrientationSensorOrientationChangedEventArgs e) { await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () { DisplayOrientation(ScenarioOutput_Orientation, e.Orientation); }); }C/CX 版本实现了完全相同的逻辑Scenario1_DataEvents.xaml.cpp同样通过Dispatcher-RunAsync(CoreDispatcherPriority::Normal, ...)将e-Orientation送回 UI 线程并在头文件 Scenario1_DataEvents.xaml.h 中用EventRegistrationTokenvisibilityToken/orientationToken保存事件句柄以便注销。C 版在OnNavigatedFrom中还会判断NavigationMode::Forward e-Uri nullptr以避免应用挂起Phone 场景时误清理事件。页面生命周期清理离开页面时若传感器事件仍处于启用状态则注销所有事件C# 的OnNavigatingFrom见 Scenario1_DataEvents.xaml.csprotected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { if (ScenarioDisableButton.IsEnabled) { Window.Current.VisibilityChanged - new WindowVisibilityChangedEventHandler(VisibilityChanged); _sensor.OrientationChanged - new TypedEventHandlerSimpleOrientationSensor, SimpleOrientationSensorOrientationChangedEventArgs(OrientationChanged); } base.OnNavigatingFrom(e); }这一模式保证了导航离开后不再有悬挂的传感器回调避免内存泄漏与无效 UI 更新。场景二轮询读取Polling轮询场景的界面Scenario2_Polling.xaml只有一个Get按钮说明文字为Performs a single request to retrieve the current device orientation.其代码极为精简核心逻辑只有一步Scenario2_Polling.xaml.csprivate void ScenarioGet(object sender, RoutedEventArgs e) { if (_sensor ! null) { DisplayOrientation(ScenarioOutput_Orientation, _sensor.GetCurrentOrientation()); } else { rootPage.NotifyUser(No simple orientation sensor found, NotifyType.ErrorMessage); } }GetCurrentOrientation()是同步方法返回SimpleOrientation枚举值不涉及事件注册与线程编组——适合需要按需读取、低功耗的场景。C/CX 版实现完全一致Scenario2_Polling.xaml.cpp。两种场景如何选择维度数据事件Data Events轮询Polling数据获取方式事件驱动方向变化自动推送手动调用GetCurrentOrientation()适用场景实时响应方向变化如自动旋转 UI、翻转检测按需读取一次快照如进入页面时读取初始方向线程要求回调在后台线程需Dispatcher编组到 UI 线程同步调用无线程切换负担资源开销持续监听需在不可见/离开页面时注销无持续监听按需消耗构建与运行系统要求Windows 10 及以上操作系统Visual Studio含 UWP 开发工作负载支持 C# 与 C/CX。构建步骤若通过 ZIP 方式获取示例务必解压整个压缩包而不是只解压单个示例文件夹——整个 Windows-universal-samples 集合共享SharedContent依赖本示例的 frontmatter 中extendedZipContent即声明了SharedContent与LICENSE的关联启动 Visual Studio选择FileOpenProject/Solution在解压目录下进入Samples/SimpleOrientationSensor子文件夹再进入首选语言的子目录cs或cpp双击其中的解决方案文件.sln按CtrlShiftB或选择BuildBuild Solution完成构建。运行与部署仅部署选择BuildDeploy Solution部署并调试运行按F5或选择DebugStart Debugging部署并无调试运行按CtrlF5或选择DebugStart Without Debugging。运行后进入 Simple Orientation Sensor 示例页选择Data Events场景点击 Enable旋转或翻转设备即可看到方向实时刷新选择Polling场景点击 Get则单次读取当前方向。若设备无方向传感器界面会显示 No simple orientation sensor found 错误提示。参考与延伸本示例曾提供 JavaScriptHTML/JS版本现已归档至 archived/SimpleOrientationSensor 目录仓库中还包含传感器家族的其他示例如 OrientationSensor三轴姿态传感器、Accelerometer加速度计、Inclinometer倾角计接口模式与本示例一致GetDefault() 事件/轮询双场景可相互参照公共 UI 模板与共享代码位于 SharedContent/Templates 与 SharedContent/cppC 版示例依赖其中的共享 XAML 与基础设施。赞分享示例工程【免费下载链接】Windows-universal-samplesAPI samples for the Universal Windows Platform.项目地址https://gitcode.com/gh_mirrors/wi/Windows-universal-samples点击查看免费下载相关推荐为什么NonSteamLaunchers是Steam Deck玩家必备的终极游戏整合工具为什么NonSteamLaunchers是Steam Deck玩家必备的终极游戏整合工具 NonSteamLaunchers是一款专为Steam Deck设计示例工程Windows-universal-samples Altimeter 示例全解析UWP 高度计传感器的数据事件与轮询两种实现Windows universal samples Altimeter 示例全解析UWP 高度计传感器的数据事件与轮询两种实现 本指南围绕 Windows u示例工程Qwen Code 接入微信基于 iLink Bot API 的 WeChat 频道完整配置指南Qwen Code 接入微信基于 iLink Bot API 的 WeChat 频道完整配置指南 微信是目前最主流的即时通讯平台之一。Qwen Code 在示例工程上一篇企业级Azure文档自动化AzViz与CI/CD流程集成实践下一篇Ambrose平台详解数据工作流可视化与实时监控的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

GraphQL Java 服务端错误处理实战:graphql-java 错误响应结构、消息脱敏与自定义执行策略

GraphQL Java 服务端错误处理实战:graphql-java 错误响应结构、消息脱敏与自定义执行策略

【免费下载链接】howtographql The Fullstack Tutorial for GraphQL 项目地址: https://gitcode.com/gh_mirrors/ho/howtographql 点击查看 免费下载 导读 本篇基于 howtographql 仓库中 graphql-java 后端教程 的「错误处理」章节,系统讲解在使用 gra…

2026/9/25 2:57:29 阅读更多 →
机械臂双相机协同标定:Kinect2+Astra手眼统一方案

机械臂双相机协同标定:Kinect2+Astra手眼统一方案

简介:本资源是一套面向计算机、自动化、人工智能等专业学生的高分毕业设计项目,聚焦多模态视觉-机械臂协同标定实践,完整实现Kinect2相机眼在手外标定与Astra奥比中光相机眼在手上标定,并集成aubo机械臂控制。适用于课程设计、期末…

2026/9/25 2:57:29 阅读更多 →
Graspness推理服务接入ROS2:从点云到机械臂抓取实战

Graspness推理服务接入ROS2:从点云到机械臂抓取实战

简介:这份资源面向机器人抓取方向的研究者与工程开发者,聚焦无序3D场景下的6自由度抓取难题。其核心是集成Graspness推理服务完成抓取姿态预测,并借助ROS2与MoveIt2打通从姿态输出到机械臂运动规划、避障与执行的全链路,可用于家庭…

2026/9/25 2:57:29 阅读更多 →

最新新闻

ESP32-S3麦克风阵列实战:波束成形与回声消除全解析

ESP32-S3麦克风阵列实战:波束成形与回声消除全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 5:18:06 阅读更多 →
WPS Office CVE-2024-7262:路径解析缺陷导致沙箱逃逸与远程代码执行

WPS Office CVE-2024-7262:路径解析缺陷导致沙箱逃逸与远程代码执行

1. 这不是“普通漏洞”,是WPS Office里一条能绕过所有沙箱的隐秘通道如果你最近在安全圈听到“CVE-2024-7262”这个编号,大概率是在红队演练复盘会上、甲方安全评估报告里,或者某位同事深夜发来的截图——一个看似普通的WPS文档,双…

2026/9/25 5:18:06 阅读更多 →
cube-ui Input 输入框组件完整指南:v-model 双向绑定、清空按钮与密码眼睛实战解析

cube-ui Input 输入框组件完整指南:v-model 双向绑定、清空按钮与密码眼睛实战解析

前端UI组件移动开发 【免费下载链接】cube-ui :large_orange_diamond: A fantastic mobile ui lib implement by Vue 项目地址: https://gitcode.com/gh_mirrors/cu/cube-ui 点击查看 免费下载 导读 本文基于 cube-ui 官方中文文档 input.md 并结合仓库源码&#…

2026/9/25 5:18:05 阅读更多 →
Eclipse Mosquitto 1.0.1 版本解析:Windows 服务 log_dest 默认值与 Python on_log() 回调修复的源码级解读

Eclipse Mosquitto 1.0.1 版本解析:Windows 服务 log_dest 默认值与 Python on_log() 回调修复的源码级解读

物联网消息队列后端网络/通信 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mo/mosquitto 点击查看 免费下载 Mosquitto 1.0.1 是 2012 年 8 月 15 日发布的纯缺陷修复版本,紧…

2026/9/25 5:18:05 阅读更多 →
CDR话单聚合数据导入MySQL:imei与cell_info全解析

CDR话单聚合数据导入MySQL:imei与cell_info全解析

简介:面向需要进行基站掉话率分析的数据处理技术人员,这份压缩包提供从原始通话话单中统计掉线率最高前10基站的完整数据与SQL方案,适用于Hive/MySQL环境下的话务数据清洗、统计与网络质量评估。资源共2个文件,包括一份CSV原始数据…

2026/9/25 5:18:05 阅读更多 →
node-sass 内置 libsass 构建指南:通过 autotools 构建并安装系统级共享库

node-sass 内置 libsass 构建指南:通过 autotools 构建并安装系统级共享库

前端构建工具 【免费下载链接】node-sass :rainbow: Node.js bindings to libsass 项目地址: https://gitcode.com/gh_mirrors/no/node-sass 点击查看 免费下载 本文基于 node-sass 仓库内置的 libsass 文档 build-shared-library.md 展开,讲解如何把 n…

2026/9/25 5:17:05 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →