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

.NET MAUI多目标PlatformBehavior编译报错:GetValue不存在等问题求助

.NET MAUI 跨平台图片模糊Behavior编译异常解决

问题场景

在.NET MAUI应用中实现了支持Android和iOS的图片模糊Behavior,采用多目标平台分部类方案:

  • 共享逻辑写在BlurBehavior.Shared.cs
  • Android平台实现写在BlurBehavior.Android.cs
  • 文件存放路径:/Behaviors/BlurBehavior/
  • 项目文件中添加了平台文件的编译筛选规则,确保非目标平台文件不参与编译

单独选择目标平台运行时构建正常,但编译整个解决方案时出现编译错误,编译器无法识别分部类的关联。

代码实现

共享类代码(BlurBehavior.Shared.cs)

public partial class BlurBehavior
{
    public static readonly BindableProperty RadiusProperty = BindableProperty.Create(nameof(Radius), typeof(float), typeof(BlurBehavior), 10f, propertyChanged: OnRadiusChanged);

    public float Radius
    {
        get => (float)GetValue(RadiusProperty);
        set => SetValue(RadiusProperty, value);
    }

    static void OnRadiusChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var behavior = (BlurBehavior)bindable;
        if (behavior.imageView is null)
        {
            return;
        }

        behavior.SetRendererEffect(behavior.imageView, Convert.ToSingle(newValue));
    }
}

Android平台类代码(BlurBehavior.Android.cs)

public partial class BlurBehavior : PlatformBehavior<Image, ImageView>
{
    ImageView? imageView;
    protected override void OnAttachedTo(Image bindable, ImageView platformView)
    {
        imageView = platformView;
        SetRendererEffect(platformView, Radius);
    }

    protected override void OnDetachedFrom(Image bindable, ImageView platformView)
    {
        SetRendererEffect(platformView, 0);
    }

    void SetRendererEffect(ImageView imageView, float radius)
    {
        if (OperatingSystem.IsAndroidVersionAtLeast(31))
        {
            var renderEffect = radius > 0 ? GetEffect(radius) : null;
            imageView.SetRenderEffect(renderEffect);
        }
        else
        {

        }
    }
    static RenderEffect? GetEffect(float radius)
    {
        return OperatingSystem.IsAndroidVersionAtLeast(31) ?
            RenderEffect.CreateBlurEffect(radius, radius, Shader.TileMode.Clamp!) :
            null;
    }
}

项目文件编译筛选规则

<!-- Android -->
<ItemGroup Condition="'$(TargetFramework)'!='net7.0-android'">
    <Compile Remove="**\**\*.Android.cs" />
    <None Include="**\**\*.Android.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
    <Compile Remove="**\Android\**\*.cs" />
    <None Include="**\Android\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

<!-- iOS -->
<ItemGroup Condition="'$(TargetFramework)'!='net7.0-ios'">
    <Compile Remove="**\**\*.iOS.cs" />
    <None Include="**\**\*.iOS.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
    <Compile Remove="**\iOS\**\*.cs" />
    <None Include="**\iOS\**\*.cs" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" />
</ItemGroup>

编译错误信息

  • BlurBehavior未包含imageView的定义
  • BlurBehavior未包含SetRenderEffect的定义
  • 无法将BindableObject类型转换为BlurBehavior类型
  • GetValue和SetValue在当前上下文中不存在

解决建议

  1. 修正共享类基类:共享的BlurBehavior必须继承自Behavior<Image>(或直接BindableObject),因为GetValue/SetValue是BindableObject的成员,当前共享类无基类导致编译器无法识别这些方法。修改后的共享类头部:

    public partial class BlurBehavior : Behavior<Image>
    
  2. 改用MAUI官方条件编译方式:替换项目文件中的手动筛选规则,在平台类文件顶部添加编译指令,更可靠且符合MAUI规范:

    • Android文件顶部添加#if ANDROID和#endif包裹类代码
    #if ANDROID
    public partial class BlurBehavior : PlatformBehavior<Image, ImageView>
    {
        // ... 原有代码 ...
    }
    #endif
    
  3. 编译时指定具体目标平台:避免编译整个解决方案,选择单个目标平台编译:

    • 在Visual Studio顶部工具栏选择具体目标平台(如net7.0-android)后执行编译
    • 或使用命令行:dotnet build -f net7.0-android
  4. 清理缓存并重启IDE:删除解决方案的bin/obj文件夹,重启Visual Studio,解决分部类识别的缓存问题。

  5. 检查多目标框架配置:确保项目文件中已正确声明所有目标框架,例如:

    <TargetFrameworks>net7.0-android;net7.0-ios</TargetFrameworks>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:40:27