You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI平台命名空间未识别,如何正确使用平台命名空间?

.NET MAUI 平台特定命名空间正确使用方案(解决跨平台命名空间报错问题)

核心问题原因

不同平台的专属命名空间仅在对应平台环境下存在,直接在共享项目(如CursorBehavior所在的共享代码)中全局导入,会导致非目标平台编译时无法识别这些命名空间,从而报错。

正确实现步骤

1. 用条件编译指令隔离平台代码

在共享项目的CursorBehavior类中,通过#if系列编译指令,仅让目标平台(如Windows)加载对应的命名空间和执行平台专属逻辑,其他平台会自动忽略这部分代码:

// 共享项目中的CursorBehavior.cs
using Microsoft.Maui.Controls;

// 仅Windows平台导入专属命名空间
#if WINDOWS
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Input;
#endif

namespace YourApp.Behaviors;

public class CursorBehavior : Behavior<VisualElement>
{
    protected override void OnAttachedTo(VisualElement bindable)
    {
        base.OnAttachedTo(bindable);
        bindable.PointerEntered += OnPointerEntered;
        bindable.PointerExited += OnPointerExited;
    }

    protected override void OnDetachingFrom(VisualElement bindable)
    {
        base.OnDetachingFrom(bindable);
        bindable.PointerEntered -= OnPointerEntered;
        bindable.PointerExited -= OnPointerExited;
    }

    private void OnPointerEntered(object sender, EventArgs e)
    {
        if (sender is not VisualElement element) return;
        
#if WINDOWS
        var nativeElement = element.Handler.PlatformView as UIElement;
        nativeElement?.SetCustomCursor(new InputSystemCursor(InputSystemCursorShape.Hand));
#endif
    }

    private void OnPointerExited(object sender, EventArgs e)
    {
        if (sender is not VisualElement element) return;
        
#if WINDOWS
        var nativeElement = element.Handler.PlatformView as UIElement;
        nativeElement?.SetCustomCursor(new InputSystemCursor(InputSystemCursorShape.Arrow));
#endif
    }
}

2. 平台专属扩展类的正确存放

你提到的CursorExtensions属于Android平台专属代码,必须放在项目的Platforms/Android目录下——该目录下的代码只会在Android平台编译,无需在共享项目中导入其命名空间,示例项目结构:

YourApp/
├── Platforms/
│   ├── Android/
│   │   ├── CursorExtensions.cs  // Android专属代码,仅Android编译时可见
│   ├── Windows/
│   │   ├── [Windows专属代码文件]
│   ├── iOS/
│   │   ├── [iOS专属代码文件]
├── Behaviors/
│   ├── CursorBehavior.cs  // 共享行为类,带条件编译逻辑

3. 禁止全局导入平台命名空间

全局using会强制所有平台加载目标命名空间,必然导致非目标平台报错。仅在对应平台的代码文件,或共享代码的条件编译块内导入平台专属命名空间即可。

验证步骤

  • 切换Visual Studio的解决方案平台到对应目标平台(如Windows),检查代码是否无报错
  • 分别编译各平台项目,确认无编译错误,若有则排查条件编译指令的包裹范围是否正确

内容的提问来源于stack exchange,提问作者Frank Mehlhop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:55:03