次の方法で共有


.NET MAUI でエフェクトを再利用する

.NET Multi-platform App UI (.NET MAUI) ハンドラーを使用したコントロールのカスタマイズには多くの利点がありますが、.NET MAUI アプリで Xamarin.Forms エフェクトを使用することもできます。 エフェクトの詳細については、「Xamarin.Forms エフェクト」をご覧ください。

Xamarin.Forms エフェクトを .NET MAUI に移行するプロセスは次のとおりです。

  1. エフェクト クラスからエフェクト属性を削除します。 詳細は、「エフェクト属性を削除する」をご覧ください。
  2. エフェクトの using ディレクティブを削除します。 詳細については、「using ディレクティブを削除する」をご覧ください。
  3. .NET MAUI アプリ プロジェクトの適切な場所に、エフェクト コードを追加します。 詳細については、「エフェクト コードを追加する」をご覧ください。
  4. エフェクトを登録します。 詳細については、「エフェクトを登録する」をご覧ください。
  5. .NET MAUI エフェクトを使用します。 詳細については、「エフェクトを使用する」をご覧ください。

エフェクト属性を削除する

エフェクト クラスから、ResolutionGroupNameAttributeExportEffectAttribute の属性をすべて削除する必要があります。

using ディレクティブを削除する

エフェクト クラスから、Xamarin.FormsXamarin.Forms.Platform.* の名前空間への参照をすべて削除する必要があります。

エフェクト コードを追加する

.NET MAUI マルチターゲット プロジェクトを使用している場合は、エフェクト コードを 1 つのファイルに結合し、Platforms フォルダーの外側に配置する必要があります。 そのためには、プラットフォーム コードに関する条件付きコンパイルを使用して、RoutingEffect 実装と PlatformEffect 実装を 1 つのファイルに結合する必要があります。 ただし、ソリューションでプラットフォームごとに個別のプロジェクトがある場合は、プラットフォーム固有のエフェクト ファイルを、対応するプロジェクトに移動する必要があります。

.NET MAUI では、RoutingEffect クラスは Microsoft.Maui.Controls 名前空間にあります。 この名前空間は .NET MAUI の暗黙的な global using ディレクティブの 1 つであるため、using ディレクティブを追加する必要はありません。 ただし、PlatformEffect クラスは Microsoft.Maui.Controls.Platform 名前空間内にあり、using ディレクティブを追加する必要があります。

次のコード例は、FocusRoutingEffect クラスとそのプラットフォーム実装を 1 つのファイルに結合するものです。

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 を開き、CreateMauiApp メソッド内の MauiAppBuilder オブジェクトに対して ConfigureEffects メソッドを呼び出します。

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

  return builder.Build();
}

エフェクトは ConfigureEffects メソッドで登録され、その configureDelegateRoutingEffect 実装に対して PlatformEffect 実装を登録します。

エフェクトを使用する

エフェクトをコントロールの Effects コレクションに追加すると、.NET MAUI アプリで使用できます。

<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>