Я реализовал размытие изображений в приложении .NET MAUI с использованием мультитаргетинга, чтобы оно было доступно как в Android, так и в iOS.
Общий класс выглядит следующим образом:
публичный частичный класс BlurBehavior { public static только для чтения BindableProperty RadiusProperty = BindableProperty.Create(nameof(Radius), typeof(float), typeof(BlurBehavior), 10f, propertyChanged: OnRadiusChanged); общедоступный плавающий радиус { get => (float)GetValue(RadiusProperty); set => SetValue(RadiusProperty, value); } static void OnRadiusChanged (привязываемый BindableObject, объект oldValue, объект newValue) { поведение вар = (BlurBehavior) привязываемый; если (behavior.imageView имеет значение null) { возвращаться; } Behavior.SetRendererEffect(behavior.imageView, Convert.ToSingle(newValue)); } } Класс Android выглядит следующим образом:
публичный частичный класс BlurBehavior: PlatformBehavior { ИзображениеView? изображениеПросмотр; защищенное переопределение void OnAttachedTo (привязываемое изображение, ImageView PlatformView) { imageView = PlatformView; SetRendererEffect (platformView, Radius); } защищенное переопределение void OnDetachedFrom (привязываемое изображение, ImageView PlatformView) { SetRendererEffect (platformView, 0); } void SetRendererEffect (ImageView imageView, плавающий радиус) { если (OperatingSystem.IsAndroidVersionAtLeast(31)) { вар renderEffect = радиус > 0? GetEffect (радиус): ноль; imageView.SetRenderEffect(renderEffect); } еще { } } статический RenderEffect? GetEffect (плавающий радиус) { вернуть OperatingSystem.IsAndroidVersionAtLeast(31) ? RenderEffect.CreateBlurEffect(радиус, радиус, Shader.TileMode.Clamp!): нулевой; } } Оба файла расположены в подпапке (/Behaviors/BlurBehavior) и имеют определенные суффиксы (BlurBehavior.[Android|iOS|Shared].cs).
Чтобы множественный таргетинг работал, я добавил фильтр в файл проекта следующим образом:
В Visual Studio, когда я, например, открываю файл BlurBehavior.Android.cs и устанавливаю раскрывающийся список целевой платформы на net7.0-android, файл выглядит хорошо — никаких сообщений об ошибках. Затем я открываю файл BlurBehavior.Shared.cs и устанавливаю раскрывающийся список целевой платформы на net7.0-android или net7.0-ios, все выглядит нормально.
Однако, когда я пытаюсь скомпилировать исходный код, компилятор выдает мне множество сообщений об ошибках
[*]BlurBehavior не содержит определения для imageView [*]BlurBehavior не содержит определения SetRenderEffect [*]Компилятор не может преобразовать тип BindableObject в мой тип BlurBehavior [*]GetValue и SetValue не существуют в текущем контексте
Как будто компилятор не может понять, что частичные классы принадлежат друг другу, поэтому он упускает тот момент, что упомянутые поля и методы определены в соответствующей реализации платформы...
Я действительно чувствую себя болваном... и надеюсь, что кто-нибудь здесь подскажет мне.
РЕДАКТИРОВАТЬ: Когда я выбираю цель в соответствующем раскрывающемся списке (например, мое Android-устройство) и напрямую нажимаю кнопку «Воспроизвести», сборка и развертывание работают. Когда я вместо этого использую меню для создания решения, выдаются сообщения об ошибках, указанных выше...
Мобильная версия