You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.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

火山引擎 最新活动