.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在当前上下文中不存在
解决建议
修正共享类基类:共享的
BlurBehavior必须继承自Behavior<Image>(或直接BindableObject),因为GetValue/SetValue是BindableObject的成员,当前共享类无基类导致编译器无法识别这些方法。修改后的共享类头部:public partial class BlurBehavior : Behavior<Image>改用MAUI官方条件编译方式:替换项目文件中的手动筛选规则,在平台类文件顶部添加编译指令,更可靠且符合MAUI规范:
- Android文件顶部添加
#if ANDROID和#endif包裹类代码
#if ANDROID public partial class BlurBehavior : PlatformBehavior<Image, ImageView> { // ... 原有代码 ... } #endif- Android文件顶部添加
编译时指定具体目标平台:避免编译整个解决方案,选择单个目标平台编译:
- 在Visual Studio顶部工具栏选择具体目标平台(如
net7.0-android)后执行编译 - 或使用命令行:
dotnet build -f net7.0-android
- 在Visual Studio顶部工具栏选择具体目标平台(如
清理缓存并重启IDE:删除解决方案的bin/obj文件夹,重启Visual Studio,解决分部类识别的缓存问题。
检查多目标框架配置:确保项目文件中已正确声明所有目标框架,例如:
<TargetFrameworks>net7.0-android;net7.0-ios</TargetFrameworks>
内容的提问来源于stack exchange,提问作者Mephisztoe
相关产品推荐
相关产品推荐

