WinUI3桌面端如何更改光标指针?指定区域光标切换方案求助
解决UWP桌面端CoreWindow.PointerCursor为null时的光标样式修改问题
针对你遇到的UWP桌面端Window.Current.CoreWindow.PointerCursor始终返回null、无法直接修改光标样式的问题,这里提供两种反射实现方案,分别对应你要的隐藏光标和进入/退出Canvas时切换十字光标的需求:
一、切换十字光标方案
通过反射获取CoreWindow的私有_pointerCursor字段,直接设置CoreCursor实例来完成光标切换:
using System.Reflection; using Windows.UI.Core; using Windows.UI.Xaml.Input; private void Canvas_PointerEntered(object sender, PointerRoutedEventArgs e) { var coreWindow = Window.Current.CoreWindow; // 反射获取CoreWindow的私有_pointerCursor字段 var pointerCursorField = typeof(CoreWindow).GetField("_pointerCursor", BindingFlags.Instance | BindingFlags.NonPublic); if (pointerCursorField != null) { // 创建十字样式光标 var crossCursor = new CoreCursor(CoreCursorType.Cross, 0); pointerCursorField.SetValue(coreWindow, crossCursor); // 强制触发光标更新 coreWindow.PointerCursor = crossCursor; } } private void Canvas_PointerExited(object sender, PointerRoutedEventArgs e) { var coreWindow = Window.Current.CoreWindow; var pointerCursorField = typeof(CoreWindow).GetField("_pointerCursor", BindingFlags.Instance | BindingFlags.NonPublic); if (pointerCursorField != null) { // 恢复默认箭头光标 var arrowCursor = new CoreCursor(CoreCursorType.Arrow, 0); pointerCursorField.SetValue(coreWindow, arrowCursor); coreWindow.PointerCursor = arrowCursor; } }
二、隐藏光标方案
方案1:使用系统原生隐藏光标(优先尝试)
Windows 10 1809及以上版本支持CoreCursorType.None直接隐藏光标,通过反射设置即可:
private void HideCursor() { var coreWindow = Window.Current.CoreWindow; var pointerCursorField = typeof(CoreWindow).GetField("_pointerCursor", BindingFlags.Instance | BindingFlags.NonPublic); if (pointerCursorField != null) { var hiddenCursor = new CoreCursor(CoreCursorType.None, 0); pointerCursorField.SetValue(coreWindow, hiddenCursor); coreWindow.PointerCursor = hiddenCursor; } } // 恢复光标可调用上面PointerExited方法里的箭头光标恢复逻辑
方案2:自定义透明光标(兼容旧版本)
如果系统不支持原生隐藏光标,可制作1x1的透明PNG图片(命名为transparent_cursor.png),添加到项目并设置生成操作为「内容」,再通过自定义光标加载:
private void HideCursorWithCustom() { var coreWindow = Window.Current.CoreWindow; var pointerCursorField = typeof(CoreWindow).GetField("_pointerCursor", BindingFlags.Instance | BindingFlags.NonPublic); if (pointerCursorField != null) { // 加载项目内的透明光标资源 var hiddenCursor = new CoreCursor(CoreCursorType.Custom, new Uri("ms-appx:///transparent_cursor.png")); pointerCursorField.SetValue(coreWindow, hiddenCursor); coreWindow.PointerCursor = hiddenCursor; } }
注意事项
- 反射依赖UWP内部字段名
_pointerCursor,目前主流桌面端版本均有效,但后续系统更新可能存在字段名变更风险。 - 自定义光标不生效时,检查图片的生成操作是否为「内容」、资源路径是否正确。
内容的提问来源于stack exchange,提问作者JPWilson
相关产品推荐
相关产品推荐

