Поделиться через


Повторное использование эффектов в .NET MAUI

Хотя существует множество преимуществ для использования обработчиков многоплатформенного пользовательского интерфейса приложений .NET (.NET MAUI) для настройки элементов управления, в приложениях .NET MAUI по-прежнему можно использовать эффекты Xamarin.Forms. Дополнительные сведения о эффектах см. в статье о эффектах Xamarin.Forms.

Процесс переноса эффекта Xamarin.Forms в .NET MAUI состоит в том, чтобы:

  1. Удалите атрибуты эффекта из классов эффектов. Дополнительные сведения см. в разделе "Удалить атрибуты эффекта".
  2. Удалите директивы эффекта using . Дополнительные сведения см. в разделе "Удалить с помощью директив".
  3. Добавьте код эффекта в соответствующее расположение в проекте приложения .NET MAUI. Дополнительные сведения см. в разделе "Добавление кода эффекта".
  4. Зарегистрируйте эффект. Дополнительные сведения см. в разделе "Регистрация эффекта".
  5. Использование эффекта .NET MAUI. Дополнительные сведения см. в разделе "Использование эффекта".

Удаление атрибутов эффекта

Все ResolutionGroupNameAttribute и ExportEffectAttribute атрибуты должны быть удалены из классов эффектов.

Удаление директив using

Все ссылки на Xamarin.Forms пространства имен и Xamarin.Forms.Platform.* пространства имен должны быть удалены из классов эффектов.

Добавление кода эффекта

Если вы используете многоцелевой проект .NET MAUI, код эффекта должен объединяться в один файл и размещаться за пределами папки Platform . Для этого необходимо объединить RoutingEffect реализацию и PlatformEffect реализацию в один файл, используя условную компиляцию по коду платформы. Однако если решение имеет отдельные проекты на платформу, то следует переместить файлы эффектов для конкретной платформы в соответствующие проекты.

В .NET MAUI RoutingEffect класс находится в Microsoft.Maui.Controls пространстве имен. Это пространство имен является одной из неявных global using директив MAUI .NET, поэтому вам не нужно добавлять директиву для нее using . PlatformEffect Однако класс находится в Microsoft.Maui.Controls.Platform пространстве имен, для которого необходимо добавить директивуusing.

В следующем примере кода показаны FocusRoutingEffect класс и его реализации платформы, объединенные в один файл:

using Microsoft.Maui.Controls.Platform;

namespace MyMauiApp.Effects;

internal class FocusRoutingEffect : RoutingEffect
{
}

#if ANDROID
internal class FocusPlatformEffect : PlatformEffect
{
    protected override void OnAttached()
    {
        // Customize the control here
    }

    protected override void OnDetached()
    {
        // Cleanup the control customization here
    }
}
#elif IOS
internal class FocusPlatformEffect : PlatformEffect
{
    protected override void OnAttached()
    {
        // Customize the control here
    }

    protected override void OnDetached()
    {
        // Cleanup the control customization here
    }
}
#elif WINDOWS
internal class FocusPlatformEffect : PlatformEffect
{
    protected override void OnAttached()
    {
        // Customize the control here
    }

    protected override void OnDetached()
    {
        // Cleanup the control customization here
    }
}
#endif

Регистрация эффекта

В проекте приложения .NET MAUI откройте MauiProgram.cs и вызовите ConfigureEffects метод объекта MauiAppBuilder в методе CreateMauiApp :

public static MauiApp CreateMauiApp()
{
  var builder = MauiApp.CreateBuilder();
  builder
    .UseMauiApp<App>()
    .ConfigureEffects(effects =>
    {
      effects.Add<FocusRoutingEffect, FocusPlatformEffect>();
    });

  return builder.Build();
}

Эффект регистрируется в методе ConfigureEffects , который configureDelegate регистрирует PlatformEffect реализацию в своей RoutingEffect реализации.

Использование эффекта

Эффект можно использовать в приложении .NET MAUI, добавив его в Effects коллекцию элемента управления:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MyMauiApp.Effects"
             x:Class="MyMauiApp.MainPage">
    <VerticalStackLayout>
        <Entry Text="Enter your text">
            <Entry.Effects>
                <local:FocusRoutingEffect />
            </Entry.Effects>
        </Entry>
    </VerticalStackLayout>
</ContentPage>