.NET Multi-platform App UI (.NET MAUI) アプリには、通常、未実行、実行中、非アクティブ、停止の 4 つの実行状態があります。 .NET MAUI では、アプリが未実行状態から実行中の状態、実行中の状態から非アクティブ状態、非アクティブ状態から停止状態、停止状態から実行中状態、停止状態から未実行状態に遷移すると、Window クラスでクロスプラットフォーム ライフサイクル イベントが発生します。
次の図は、.NET MAUI アプリのライフサイクルの概要を示しています。
図の灰色の楕円は、アプリがメモリに読み込まれていないことを示しています。 水色の楕円は、アプリがメモリ内にあることを示します。 円弧上のテキストは、.NET MAUI で発生するイベントを示しています。これらのイベントは、実行中のアプリに通知を提供します。
アプリの実行状態は、アプリの履歴によって異なります。 たとえば、アプリが初めてインストールされたとき、またはデバイスが起動された場合、アプリは未実行と見なすことができます。 アプリが起動されると、Created イベントと Activated イベントが発生し、アプリが実行中になります。 別のアプリ ウィンドウがフォーカスを取得すると、Deactivated イベントが発生し、アプリが非アクティブになります。 ユーザーが別のアプリに切り替えるか、デバイスのホーム画面に戻ってアプリ ウィンドウが非表示になると、Deactivated イベントと Stopped イベントが発生し、アプリは停止になります。 ユーザーがアプリに戻ると、Resuming イベントが発生し、アプリが実行中になります。 実行中にユーザーがアプリを終了する場合もあります。 この状況では、アプリが非アクティブになった後で停止になり、Destroying イベントが発生し、アプリが未実行になります。 同様に、デバイスが、リソースの制限によりアプリの停止中にアプリを終了する場合があり、その場合は Destroying イベントが発生し、アプリが未実行になります。
さらに、.NET MAUI を使用すると、プラットフォーム ライフサイクル イベントが発生したときにアプリで通知を受け取ることができます。 詳細については、「プラットフォーム ライフサイクル イベント」をご覧ください。
クロスプラットフォーム ライフサイクル イベント
Window クラスは、次のクロスプラットフォーム ライフサイクル イベントを定義します。
| イベント | 説明 | 実行するアクション |
|---|---|---|
Created |
このイベントは、ネイティブ ウィンドウが作成された後に発生します。 この時点で、クロスプラットフォーム ウィンドウにはネイティブ ウィンドウ ハンドラーがありますが、ウィンドウがまだ表示されていない可能性があります。 | |
Activated |
このイベントは、ウィンドウがアクティブ化され、フォーカスされたウィンドウであるか、またはウィンドウになると発生します。 | |
Deactivated |
このイベントは、ウィンドウがフォーカスされなくなると発生します。 ただし、ウィンドウは引き続き表示されている可能性があります。 | |
Stopped |
このイベントは、ウィンドウが表示されなくなると発生します。 オペレーティング システムがアプリを終了させている可能性があるため、この状態からアプリが再開する保証はありません。 | 実行時間の長いプロセスから切断するか、デバイス リソースを消費する可能性がある保留中の要求を取り消します。 |
Resumed |
このイベントは、停止後にアプリが再開されたときに発生します。 このイベントは、アプリの初回起動時には発生せず、Stopped イベントが以前に発生した場合にのみ発生します。 |
必要なイベントをサブスクライブし、表示されているページ上にあるすべてのコンテンツを更新します。 |
Destroying |
このイベントは、ネイティブ ウィンドウが破棄され割り当てが解除されると発生します。 アプリが再度開かれたときに、同じクロスプラットフォーム ウィンドウが新しいネイティブ ウィンドウに対して使用される場合があります。 | ネイティブ ウィンドウにアタッチしたイベント サブスクリプションをすべて削除します。 |
これらのクロスプラットフォーム イベントは、異なるプラットフォーム イベントにマッピングされます。このマッピングを次の表に示します。
| イベント | Android | iOS | Windows |
|---|---|---|---|
Created |
OnPostCreate |
FinishedLaunching |
Created |
Activated |
OnResume |
OnActivated |
Activated (CodeActivated と PointerActivated) |
Deactivated |
OnPause |
OnResignActivation |
Activated (Deactivated) |
Stopped |
OnStop |
DidEnterBackground |
VisibilityChanged |
Resumed |
OnRestart |
WillEnterForeground |
Resumed |
Destroying |
OnDestroy |
WillTerminate |
Closed |
さらに、Window クラスには、iOS と Mac Catalyst でウィンドウが閉じられたりバックグラウンド状態になったりすると発生する、Backgrounding イベントも定義されています。 このイベントには BackgroundingEventArgs オブジェクトが付随し、任意の string 状態が State オブジェクトの BackgroundingEventArgs プロパティに対して保持される必要があります。このオブジェクトは、ウィンドウを再開するまで OS で保持されます。 ウィンドウが再開されると、IActivationState オーバーライドの CreateWindow 引数から状態が提供されます。
これらのイベントに加えて、Window クラスには次のオーバーライド可能なライフサイクル メソッドもあります。
-
OnCreated:Createdイベントの発生時に呼び出されます。 -
OnActivated:Activatedイベントの発生時に呼び出されます。 -
OnDeactivated:Deactivatedイベントの発生時に呼び出されます。 -
OnStopped:Stoppedイベントの発生時に呼び出されます。 -
OnResumed:Resumedイベントの発生時に呼び出されます。 -
OnDestroying:Destroyingイベントの発生時に呼び出されます。 -
OnBackgrounding:Backgroundingイベントの発生時に呼び出されます。
Window ライフサイクル イベントをサブスクライブするには、CreateWindow クラス内の App メソッドをオーバーライドして、イベントをサブスクライブできる Window インスタンスを作成します。
namespace MyMauiApp
{
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new MainPage();
}
protected override Window CreateWindow(IActivationState? activationState)
{
Window window = new Window(new AppShell());
window.Created += (s, e) =>
{
// Custom logic
};
return window;
}
}
}
namespace MyMauiApp
{
public partial class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState activationState)
{
Window window = base.CreateWindow(activationState);
window.Created += (s, e) =>
{
// Custom logic
};
return window;
}
}
}
また、ライフサイクルのオーバーライドを使用するには、Window クラスから派生するクラスを作成します。
namespace MyMauiApp
{
public class MyWindow : Window
{
public MyWindow() : base()
{
}
public MyWindow(Page page) : base(page)
{
}
protected override void OnCreated()
{
// Register services
}
}
}
Window派生クラスを使用するには、CreateWindow クラスのApp メソッドをオーバーライドして、MyWindow インスタンスを返します。
public partial class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState? activationState)
{
return new MyWindow();
}
}
警告
InvalidOperationException がスローされますApp.MainPage プロパティが設定され、CreateWindow メソッドがPage引数を受け取るオーバーライドを使用してWindow オブジェクトを作成すると。
プラットフォーム ライフサイクル イベント
.NET MAUI は、発生しているプラットフォーム ライフサイクル イベントに応答して呼び出されるデリゲートを定義します。 これらのデリゲートには、名前付きメソッドまたは匿名関数を使用してハンドラーを指定できます。これは、デリゲートが呼び出されたときに実行されます。 このメカニズムにより、一般的なプラットフォーム ライフサイクル イベントが発生したときにアプリに通知を送ることができます。
重要
ConfigureLifecycleEvents メソッドは、Microsoft.Maui.LifecycleEvents 名前空間内にあります。
Android
次の表は、Android ライフサイクル イベントが発生した場合に呼び出される .NET MAUI デリゲートの一覧です。
| デリゲート | 引数 | 説明 | コメント |
|---|---|---|---|
OnActivityResult |
Android.App.Activity、int、Android.App.Result、Android.Content.Intent? |
自身が起動したアクティビティが終了したときに呼び出されます。 | |
OnApplicationConfigurationChanged |
Android.App.Application, Android.Content.Res.Configuration |
コンポーネントの実行中にデバイス構成が変更されたときに呼び出されます。 | |
OnApplicationCreate |
Android.App.Application |
アプリが起動されたときに、アクティビティ、サービス、またはレシーバー オブジェクト (コンテンツ プロバイダーを除く) が作成される前に呼び出されます。 | |
OnApplicationCreating |
Android.App.Application |
アプリの起動中、アクティビティ、サービス、またはレシーバー オブジェクト (コンテンツ プロバイダーを除く) が作成される前に呼び出されます。 | |
OnApplicationLowMemory |
Android.App.Application |
システムがメモリ不足の状態で実行されていて、アクティブに実行中のプロセスのメモリ使用量を削減する必要がある場合に呼び出されます。 | |
OnApplicationTrimMemory |
Android.App.Application, Android.Content.TrimMemory |
不要なメモリをプロセスから削減するのに適したタイミングであるとオペレーティング システムが判断したときに呼び出されます。 | |
OnBackPressed |
Android.App.Activity |
アクティビティで、バック キーが押されたことを検出したときに呼び出されます。 | |
OnConfigurationChanged |
Android.App.Activity, Android.Content.Res.Configuration |
アクティビティの実行中にデバイス構成が変更されたときに呼び出されます。 | |
OnCreate |
Android.App.Activity, Android.OS.Bundle? |
アクティビティの作成時に発生します。 | |
OnDestroy |
Android.App.Activity |
アクティビティが終了するとき、またはシステムが領域を節約するためにアクティビティ インスタンスを一時的に破棄しているときに呼び出されます。 | 常にスーパー クラスの実装を呼び出します。 |
OnNewIntent |
Android.App.Activity、Android.Content.Intent? |
アクティビティの新しいインスタンスを開始する代わりに、アクティビティ スタックの最上位でアクティビティが再起動されたときに呼び出されます。 | |
OnPause |
Android.App.Activity |
アクティビティがバックグラウンドに移行中で、まだ強制終了されていない場合に呼び出されます。 | 常にスーパー クラスの実装を呼び出します。 |
OnPostCreate |
Android.App.Activity, Android.OS.Bundle? |
アクティビティの起動が完了し、OnStart と OnRestoreInstanceState が呼び出された後に呼び出されます。 |
常にスーパー クラスの実装を呼び出します。 これはシステム専用のイベントであり、通常はアプリでは使用しません。 |
OnPostResume |
Android.App.Activity |
アクティビティの再開が完了したとき、OnResume が呼び出された後に呼び出されます。 |
常にスーパー クラスの実装を呼び出します。 これはシステム専用のイベントであり、通常はアプリでは使用しません。 |
OnRequestPermissionsResult |
Android.App.Activity、int、string[]、Android.Content.PM.Permission[] |
アクセス許可を要求した結果のコールバックとして呼び出されます。 | |
OnRestart |
Android.App.Activity |
OnStop の後、現在のアクティビティがユーザーに再表示される (ユーザーが移動して戻ってきた) ときに呼び出されます。 |
常にスーパー クラスの実装を呼び出します。 |
OnRestoreInstanceState |
Android.App.Activity, Android.OS.Bundle |
アクティビティが以前に保存された状態から再初期化されるとき、OnStart の後に呼び出されます。 |
|
OnResume |
Android.App.Activity |
OnRestoreInstanceState、OnRestart、OnPause の後に呼び出され、アクティビティがアクティブで、入力を受け取る準備ができていることを示します。 |
|
OnSaveInstanceState |
Android.App.Activity, Android.OS.Bundle |
OnCreate または OnRestoreInstanceState で状態を復元できるように、強制終了中のアクティビティからインスタンスごとの状態を取得するために呼び出されます。 |
|
OnStart |
Android.App.Activity |
OnCreate または OnRestart の後、アクティビティが停止していますが、現在ユーザーに表示されているときに呼び出されます。 |
常にスーパー クラスの実装を呼び出します。 |
OnStop |
Android.App.Activity |
アクティビティがユーザーに表示されなくなったときに呼び出されます。 | 常にスーパー クラスの実装を呼び出します。 |
重要
各デリゲートには、対応する同じ名前の拡張メソッドがあり、デリゲートのハンドラーを登録するために呼び出すことができます。
呼び出されている Android ライフサイクル デリゲートに応答するには、ConfigureLifecycleEvents クラスの MauiAppBuilder メソッド内の CreateMauiapp オブジェクトに対して MauiProgram メソッドを呼び出します。 次に、ILifecycleBuilder オブジェクトで AddAndroid メソッドを呼び出し、必要なデリゲートのハンドラーを登録する Action を指定します。
using Microsoft.Maui.LifecycleEvents;
namespace PlatformLifecycleDemo
{
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureLifecycleEvents(events =>
{
#if ANDROID
events.AddAndroid(android => android
.OnActivityResult((activity, requestCode, resultCode, data) => LogEvent(nameof(AndroidLifecycle.OnActivityResult), requestCode.ToString()))
.OnStart((activity) => LogEvent(nameof(AndroidLifecycle.OnStart)))
.OnCreate((activity, bundle) => LogEvent(nameof(AndroidLifecycle.OnCreate)))
.OnBackPressed((activity) => LogEvent(nameof(AndroidLifecycle.OnBackPressed)) && false)
.OnStop((activity) => LogEvent(nameof(AndroidLifecycle.OnStop))));
#endif
static bool LogEvent(string eventName, string type = null)
{
System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
return true;
}
});
return builder.Build();
}
}
}
Android アプリのライフサイクルの詳細については、developer.android.com の「アクティビティのライフサイクルについて」をご覧ください。
iOS と Mac Catalyst
次の表は、iOS および Mac Catalyst のライフサイクル イベントが発生した場合に呼び出される .NET MAUI のデリゲートの一覧です。
| デリゲート | 引数 | 説明 |
|---|---|---|
ApplicationSignificantTimeChange |
UIKit.UIApplication |
午前 0 時などのキャリアが変更された時刻、夏時間の開始または停止など、大幅な時間変更が発生したときに呼び出されます。 |
ContinueUserActivity |
UIKit.UIApplication、Foundation.NSUserActivity、UIKit.UIApplicationRestorationHandler |
ハンドオフを使用して別のデバイスからアクティビティを転送するなど、ユーザー アクティビティに関連付けられたデータをアプリが受信したときに呼び出されます。 |
DidEnterBackground |
UIKit.UIApplication |
アプリがバックグラウンドに入ったときに呼び出されます。 |
FinishedLaunching |
UIKit.UIApplication, Foundation.NSDictionary |
アプリが起動したときに呼び出されます。 |
OnActivated |
UIKit.UIApplication |
アプリの起動時や、アプリがフォアグラウンドに戻るたびに呼び出されます。 |
OnResignActivation |
UIKit.UIApplication |
アプリがバックグラウンドに入るとき、中断されるとき、またはユーザーが電話やテキストなどの中断を受けたときに呼び出されます。 |
OpenUrl |
UIKit.UIApplication, Foundation.NSDictionary |
アプリが指定した URL を開く必要があるときに呼び出されます。 |
PerformActionForShortcutItem |
UIKit.UIApplication、UIKit.UIApplicationShortcutItem、UIKit.UIOperationHandler |
ホーム画面のクイック アクションが開始されたときに呼び出されます。 |
PerformFetch |
UIKit.UIApplication, Action<UIBackgroundFetchResult> |
ダウンロードするデータがある場合に、フェッチ操作を開始できることをアプリに通知するために呼び出されます。 |
SceneContinueUserActivity |
UIKit.UIScene, Foundation.NSUserActivity |
指定したハンドオフ関連のアクティビティを処理するために呼び出されます。 |
SceneDidDisconnect |
UIKit.UIScene |
シーンがアプリから削除されたときに呼び出されます。 |
SceneDidEnterBackground |
UIKit.UIScene |
シーンがバックグラウンドで実行されていて、画面上にない場合に呼び出されます。 |
SceneDidFailToContinueUserActivity |
UIKit.UIScene、string、Foundation.NSError |
アクティビティを完了できなかったことをユーザーに通知するために呼び出されます。 |
SceneDidUpdateUserActivity |
UIKit.UIScene, Foundation.NSUserActivity |
指定したアクティビティが更新されたときに呼び出されます。 |
SceneOnActivated |
UIKit.UIScene |
シーンがアクティブになり、ユーザー イベントに応答できるようになると呼び出されます。 |
SceneOnResignActivation |
UIKit.UIScene |
シーンがアクティブな状態を終了し、ユーザー イベントへの応答を停止しようとしているときに呼び出されます。 |
SceneOpenUrl |
UIKit.UIScene, Foundation.NSSet<UIKit.UIOpenUrlContext> |
シーンが 1 つ以上の URL を開くよう要求したときに呼び出されます。 |
SceneRestoreInteractionState |
UIKit.UIScene, Foundation.NSUserActivity |
アクティビティの状態を復元するために呼び出されます。 |
SceneWillConnect |
UIKit.UIScene、UIKit.UISceneSession、UIKit.UISceneConnectionOptions |
シーンがアプリに追加されたときに呼び出されます。 |
SceneWillContinueUserActivity |
UIKit.UIScene, string |
ハンドオフ関連のデータを受け取る準備をするために呼び出されます。 |
SceneWillEnterForeground |
UIKit.UIScene |
シーンがフォアグラウンドで実行され、ユーザーに表示されるときに呼び出されます。 |
WillEnterForeground |
UIKit.UIApplication |
アプリがバックグラウンド状態から戻る場合に呼び出されます。 |
WillFinishLaunching |
UIKit.UIApplication, Foundation.NSDictionary |
アプリの起動が開始されても、状態の復元がまだ発生していないときに呼び出されます。 |
WillTerminate |
UIKit.UIApplication |
メモリの制約のためにアプリが終了した場合、またはユーザーが直接アプリを終了した場合に呼び出されます。 |
WindowSceneDidUpdateCoordinateSpace |
UIKit.UIWindowScene、UIKit.IUICoordinateSpace、UIKit.UIInterfaceOrientation、UIKit.UITraitCollection |
シーンのサイズ、向き、または特性が変化したときに呼び出されます。 |
重要
PerformFetch を除く各デリゲートには、同じ名前の拡張メソッドがあります。この拡張メソッドは、デリゲートのハンドラーを登録するために呼び出すことができます。
呼び出された iOS および Mac Catalyst のライフサイクル デリゲートに応答するには、ConfigureLifecycleEvents クラスの MauiAppBuilder メソッド内で CreateMauiapp オブジェクトに対して MauiProgram メソッドを呼び出します。 次に、ILifecycleBuilder オブジェクトで AddiOS メソッドを呼び出し、必要なデリゲートのハンドラーを登録する Action を指定します。
using Microsoft.Maui.LifecycleEvents;
namespace PlatformLifecycleDemo
{
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureLifecycleEvents(events =>
{
#if IOS || MACCATALYST
events.AddiOS(ios => ios
.OnActivated((app) => LogEvent(nameof(iOSLifecycle.OnActivated)))
.OnResignActivation((app) => LogEvent(nameof(iOSLifecycle.OnResignActivation)))
.DidEnterBackground((app) => LogEvent(nameof(iOSLifecycle.DidEnterBackground)))
.WillTerminate((app) => LogEvent(nameof(iOSLifecycle.WillTerminate))));
#endif
static bool LogEvent(string eventName, string type = null)
{
System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
return true;
}
});
return builder.Build();
}
}
}
iOS アプリのライフサイクルの詳細については、developer.apple.com の「Managing Your App's Life Cycl」をご覧ください。
Windows
次の表に、発生している Windows ライフサイクル イベントに応答して呼び出される .NET MAUI デリゲートを示します。
| デリゲート | 引数 | 説明 |
|---|---|---|
OnActivated |
Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.WindowActivatedEventArgs |
アプリの再開中以外の場合にプラットフォーム Activated イベントが発生したときに呼び出されます。 |
OnClosed |
Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.WindowEventArgs |
プラットフォーム Closed イベントが発生したときに呼び出されます。 |
OnLaunched |
Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.LaunchActivatedEventArgs |
ネイティブ ウィンドウが作成されてアクティブ化されると、.NET MAUI の Application.OnLaunched オーバーライドによって呼び出されます。 |
OnLaunching |
Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.LaunchActivatedEventArgs |
ネイティブ ウィンドウが作成されてアクティブ化される前に、.NET MAUI の Application.OnLaunched オーバーライドによって呼び出されます。 |
OnPlatformMessage |
Microsoft.UI.Xaml.Window, WindowsPlatformMessageEventArgs |
.NET MAUI が特定のネイティブ Windows メッセージを受信したときに呼び出されます。 |
OnPlatformWindowSubclassed |
Microsoft.UI.Xaml.Window, WindowsPlatformWindowSubclassedEventArgs |
Win32 ウィンドウがサブクラス化されたときに .NET MAUI によって呼び出されます。 |
OnResumed |
Microsoft.UI.Xaml.Window |
アプリが再開中の場合、プラットフォーム Activated イベントが発生したときに呼び出されます。 |
OnVisibilityChanged |
Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.WindowVisibilityChangedEventArgs |
プラットフォーム VisibilityChanged イベントが発生したときに呼び出されます。 |
OnWindowCreated |
Microsoft.UI.Xaml.Window |
クロスプラットフォーム Window 用にネイティブ ウィンドウが作成されたときに呼び出されます。 |
.NET MAUI は、OnPlatformMessage デリゲートを使用して、特定のネイティブ Windows メッセージをライフサイクル イベントとして公開します。 このデリゲートに付随する WindowsPlatformMessageEventArgs オブジェクトには、MessageId 型の uint プロパティが含まれています。 このプロパティの値を調べて、アプリ ウィンドウに渡されたメッセージを確認できます。 Windows メッセージの詳細については、「Windows メッセージ (Win32 と C++ の概要)」をご覧ください。 ウィンドウ メッセージ定数の一覧については、「ウィンドウ通知」をご覧ください。
重要
各デリゲートには、対応する同じ名前の拡張メソッドがあり、デリゲートのハンドラーを登録するために呼び出すことができます。
呼び出される Windows ライフサイクル デリゲートに応答するには、ConfigureLifecycleEvents クラスの MauiAppBuilder メソッドで CreateMauiApp オブジェクトに対して MauiProgram メソッドを呼び出します。 次に、ILifecycleBuilder オブジェクトで AddWindows メソッドを呼び出し、必要なデリゲートのハンドラーを登録する Action を指定します。
using Microsoft.Maui.LifecycleEvents;
namespace PlatformLifecycleDemo
{
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureLifecycleEvents(events =>
{
#if WINDOWS
events.AddWindows(windows => windows
.OnActivated((window, args) => LogEvent(nameof(WindowsLifecycle.OnActivated)))
.OnClosed((window, args) => LogEvent(nameof(WindowsLifecycle.OnClosed)))
.OnLaunched((window, args) => LogEvent(nameof(WindowsLifecycle.OnLaunched)))
.OnLaunching((window, args) => LogEvent(nameof(WindowsLifecycle.OnLaunching)))
.OnVisibilityChanged((window, args) => LogEvent(nameof(WindowsLifecycle.OnVisibilityChanged)))
.OnPlatformMessage((window, args) =>
{
if (args.MessageId == Convert.ToUInt32("031A", 16))
{
// System theme has changed
}
}));
#endif
static bool LogEvent(string eventName, string type = null)
{
System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
return true;
}
});
return builder.Build();
}
}
}
Window オブジェクトを取得する
プラットフォーム コードでは、Window 拡張メソッドを使用して、プラットフォーム ライフサイクル イベントからアプリの GetWindow オブジェクトを取得できます。
using Microsoft.Maui.LifecycleEvents;
namespace PlatformLifecycleDemo
{
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureLifecycleEvents(events =>
{
#if WINDOWS
events.AddWindows(windows => windows
.OnClosed((window, args) =>
{
IWindow appWindow = window.GetWindow();
}));
#endif
});
return builder.Build();
}
}
}
カスタム ライフサイクル イベント
.NET MAUI では、発生中のプラットフォーム ライフサイクル イベントに応じて呼び出されるデリゲートを定義していますが、公開するのは共通のプラットフォーム ライフサイクル イベント セットのみです。 ただし、通常ライブラリ作成者を対象とするメカニズムも含まれており、これを使用して、追加のプラットフォーム ライフサイクル イベントが発生したときにアプリで通知を受け取ることもできます。 その手順は次のとおりです。
- .NET MAUI で公開されていないプラットフォーム ライフサイクル イベントのイベント ハンドラーを登録します。
- プラットフォーム ライフサイクル イベントのイベント ハンドラーで、
ILifecycleEventServiceインスタンスを取得し、そのInvokeEventsメソッドを呼び出して、プラットフォーム イベント名を引数として指定します。
次に、プラットフォーム ライフサイクル イベントの通知を受け取るアプリで、CreateMauiApp オブジェクトの MauiProgram メソッドを呼び出すように ConfigureLifecycleEvents クラスの MauiAppBuilder メソッドを変更します。 次に、ILifecycleBuilder オブジェクトで AddEvent メソッドを呼び出し、プラットフォーム イベントが発生したときに呼び出されるプラットフォーム イベントの名前と Action を指定します。
例
WinUI 3 Window.SizeChanged イベントは、ネイティブ アプリ ウィンドウが最初にレンダリングされたとき、またはレンダリング サイズが変更されたときに発生します。 .NET MAUI では、このプラットフォーム イベントはライフサイクル イベントとして公開されません。 ただし、次の方法を使用して、このプラットフォーム イベントが発生したときにアプリで通知を受け取ることができます。
Window.SizeChanged プラットフォーム ライフサイクル イベントのイベント ハンドラーを登録します。
using Microsoft.Maui.LifecycleEvents; ... public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureLifecycleEvents(events => { #if WINDOWS events.AddWindows(windows => windows .OnWindowCreated(window => { window.SizeChanged += OnSizeChanged; })); #endif }); return builder.Build(); }プラットフォーム ライフサイクル イベントのイベント ハンドラーで、
ILifecycleEventServiceインスタンスを取得し、そのInvokeEventsメソッドを呼び出し、プラットフォーム イベント名を引数として指定します。using Microsoft.Maui.LifecycleEvents; ... #if WINDOWS static void OnSizeChanged(object sender, Microsoft.UI.Xaml.WindowSizeChangedEventArgs args) { ILifecycleEventService service = MauiWinUIApplication.Current.Services.GetRequiredService<ILifecycleEventService>(); service.InvokeEvents(nameof(Microsoft.UI.Xaml.Window.SizeChanged)); } #endifWindows では
MauiWinUIApplication型を使用して、そのCurrentプロパティからネイティブ アプリ インスタンスにアクセスできます。 Android ではMauiApplication型を使用して、ネイティブ アプリ インスタンスにアクセスできます。 同様に、iOS ではMauiUIApplicationDelegate型を使用して、ネイティブ アプリ インスタンスにアクセスできます。警告
InvokeEventsメソッドを使用して未登録のイベントを呼び出しても、例外はスローされません。CreateMauiAppクラスのMauiProgramメソッドで、ConfigureLifecycleEventsオブジェクトのMauiAppBuilderメソッドを呼び出します。 次に、ILifecycleBuilderオブジェクトでAddEventメソッドを呼び出し、プラットフォーム イベントの名前と、プラットフォーム イベントが発生したときに呼び出されるActionを指定します。using Microsoft.Maui.LifecycleEvents; namespace PlatformLifecycleDemo { public static class MauiProgram { public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureLifecycleEvents(events => { #if WINDOWS events.AddWindows(windows => windows .OnWindowCreated(window => { window.SizeChanged += OnSizeChanged; })); events.AddEvent(nameof(Microsoft.UI.Xaml.Window.SizeChanged), () => LogEvent("Window SizeChanged")); #endif static bool LogEvent(string eventName, string type = null) { System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}"); return true; } }); return builder.Build(); } } }
全体的な効果としては、ユーザーが Windows でアプリ ウィンドウのサイズを変更すると、AddEvent メソッドで指定されたアクションが実行されます。
注
AddEvent メソッドには、デリゲートを指定できるようにするオーバーロードもあります。
.NET MAUI