.NET MAUI中Windows平台光标样式修改及CoreWindow为空问题解决
.NET MAUI中Windows平台光标样式修改及CoreWindow为空问题解决
嗨,我来帮你搞定这个.NET MAUI Windows平台光标修改的问题,特别是你遇到的CoreWindow为空的情况~
首先说下你遇到的CoreWindow为空的原因:大概率是你获取窗口的时机不对,比如在页面构造函数或者初始化阶段就调用这段代码,这时候MAUI还没完成WinUI平台视图的绑定,自然拿不到有效的CoreWindow。
接下来给你两种解决思路,分别对应全局窗口光标修改和单个控件的光标修改:
一、修改整个窗口的光标样式(含隐藏光标)
你需要确保在页面完全加载完成后再执行光标修改逻辑,比如在页面的OnAppearing方法里,配合Dispatcher延迟执行,保证平台视图已经初始化完成。代码示例如下:
protected override void OnAppearing() { base.OnAppearing(); // 用Dispatcher延迟执行,给MAUI一点时间完成平台视图初始化 Dispatcher.Dispatch(async () => { await Task.Delay(100); // 这个延迟时间可以根据实际情况调整,不用太长 var window = App.Current.MainPage.GetParentWindow().Handler.PlatformView as MauiWinUIWindow; if (window != null) { // 先检查CoreWindow是否可用 if (window.CoreWindow != null) { // 示例:改为手型光标 window.CoreWindow.PointerCursor = new Windows.UI.Core.CoreCursor(Windows.UI.Core.CoreCursorType.Hand, 0); // 如果要隐藏光标,替换成下面这行 // window.CoreWindow.PointerCursor = new Windows.UI.Core.CoreCursor(Windows.UI.Core.CoreCursorType.None, 0); } else { // 备选方案:通过线程获取当前CoreWindow var coreWindow = Windows.UI.Core.CoreWindow.GetForCurrentThread(); if (coreWindow != null) { coreWindow.PointerCursor = new Windows.UI.Core.CoreCursor(Windows.UI.Core.CoreCursorType.Hand, 0); } } } }); }
二、修改单个控件的光标样式
如果你只想让某个特定控件(比如按钮、输入框)显示不同的光标,可以通过控件的HandlerChanged事件获取对应的WinUI原生控件,然后设置它的光标属性:
// 假设你有一个名为btnSubmit的MAUI Button控件 btnSubmit.HandlerChanged += (sender, e) => { // 获取WinUI原生Button控件 if (btnSubmit.Handler?.PlatformView is Microsoft.UI.Xaml.Controls.Button winUiBtn) { // 设置为手型光标 winUiBtn.Cursor = new Microsoft.UI.Xaml.Input.CoreCursor(Microsoft.UI.Xaml.Input.CoreCursorType.Hand, 0); } };
这样就能针对单个控件单独设置光标样式啦。
备注:内容来源于stack exchange,提问作者marcos sos




