.NET MAUI でエフェクトを再利用する
.NET Multi-platform App UI (.NET MAUI) ハンドラーを使用したコントロールのカスタマイズには多くの利点がありますが、.NET MAUI アプリで Xamarin.Forms エフェクトを使用することもできます。 エフェクトの詳細については、「Xamarin.Forms エフェクト」をご覧ください。
Xamarin.Forms エフェクトを .NET MAUI に移行するプロセスは次のとおりです。
- エフェクト クラスからエフェクト属性を削除します。 詳細は、「エフェクト属性を削除する」をご覧ください。
- エフェクトの
using
ディレクティブを削除します。 詳細については、「using ディレクティブを削除する」をご覧ください。 - .NET MAUI アプリ プロジェクトの適切な場所に、エフェクト コードを追加します。 詳細については、「エフェクト コードを追加する」をご覧ください。
- エフェクトを登録します。 詳細については、「エフェクトを登録する」をご覧ください。
- .NET MAUI エフェクトを使用します。 詳細については、「エフェクトを使用する」をご覧ください。
エフェクト属性を削除する
エフェクト クラスから、ResolutionGroupNameAttribute
と ExportEffectAttribute
の属性をすべて削除する必要があります。
using ディレクティブを削除する
エフェクト クラスから、Xamarin.Forms
と Xamarin.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 メソッドで登録され、その configureDelegate
が RoutingEffect 実装に対して 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>
.NET MAUI