.NET MAUI ウィンドウ
.NET Multi-platform App UI (.NET MAUI) Window クラスは、複数のウィンドウを作成、構成、表示、管理する機能を提供します。
Window には、次のプロパティが定義されています。
- FlowDirection は
FlowDirection
型で、ウィンドウの UI 要素がレイアウトされる方向を定義します。 - Height は
double
型で、Windows 上のウィンドウの高さを指定します。 - MaximumHeight は
double
型で、デスクトップ プラットフォーム上のウィンドウの最大の高さを表します。 有効な値は、0 からdouble.PositiveInfinity
の範囲です。 - MaximumWidth は
double
型で、デスクトップ プラットフォーム上のウィンドウの最大の幅を表します。 有効な値は、0 からdouble.PositiveInfinity
の範囲です。 - MinimumHeight は
double
型で、デスクトップ プラットフォーム上のウィンドウの最小の高さを表します。 有効な値は、0 からdouble.PositiveInfinity
の範囲です。 - MinimumWidth は
double
型で、デスクトップ プラットフォーム上のウィンドウの最小の幅を表します。 有効な値は、0 からdouble.PositiveInfinity
の範囲です。 - Overlays は
IReadOnlyCollection<IWindowOverlay>
型で、ウィンドウ オーバーレイのコレクションを表します。 - Page は Page 型で、ウィンドウに表示されているページを示します。 このプロパティは、Window クラスのコンテンツ プロパティであるため、明示的に設定する必要はありません。
- Title は
string
型で、ウィンドウのタイトルを表します。 - Width は
double
型で、Windows 上のウィンドウの幅を指定します。 - X は
double
型で、Windows 上のウィンドウの X 座標を指定します。 - Y は
double
型で、Windows 上のウィンドウの Y 座標を指定します。
Overlays
プロパティを除き、これらのプロパティはすべて BindableProperty オブジェクトを基盤としています。つまり、これらのプロパティはデータ バインディングの対象になり、スタイルを設定することができます。
Window クラスでは次のイベントを定義します。
- Created は、ウィンドウの作成時に発生します。
- Resumed は、ウィンドウがスリープ状態から再開されたときに発生します。
- Activated は、ウィンドウがアクティブ化されたときに発生します。
- Deactivated は、ウィンドウが非アクティブ化されたときに発生します。
- Stopped は、ウィンドウが停止したときに発生します。
- Destroying は、ウィンドウが破棄されたときに発生します。
- SizeChanged は、ウィンドウのサイズが変更されたときにデスクトップ プラットフォームで発生します。
- Backgrounding は、ウィンドウが閉じられるか、バックグラウンド状態になったときに iOS と Mac Catalyst で発生する
BackgroundingEventArgs
オブジェクトを伴います。 このイベントを使用すると、BackgroundingEventArgs
オブジェクトのState
プロパティに任意のstring
状態を保持できます。この状態は、ウィンドウを再開するまで OS によって保持されます。 ウィンドウが再開されると、状態はIActivationState
引数を介してCreateWindow
メソッドに提供されます。 - DisplayDensityChanged は、
DisplayDensityChangedEventArgs
オブジェクトが付随します。このイベントは、ウィンドウの実効ドット/インチ (DPI) が変更されたときに、Android および Windows で発生します。
ライフサイクル イベントとそれに関連するオーバーライドの詳細については、「アプリのライフサイクル」をご覧ください。
Window クラスでは、次のモーダル ナビゲーション イベントも定義します。
- ModalPopped は
ModalPoppedEventArgs
型で、ビューがモーダルにポップされたときに発生します。 - ModalPopping は
ModalPoppingEventArgs
型で、ビューがモーダルにポップされたときに発生します。 - ModalPushed は
ModalPushedEventArgs
型で、ビューがモーダルとしてプッシュされた後に発生します。 - ModalPushing は
ModalPushingEventArgs
型で、ビューがモーダルにプッシュされたときに発生します。 - PopCanceled は、モーダル ポップが取り消されたときに発生します。
VisualElement クラスには、親の Window オブジェクトを公開する Window
プロパティがあります。 このプロパティには、任意のページ、レイアウト、またはビューからアクセスして、Window オブジェクトを操作できます。
ウィンドウの作成
既定では、MainPage
プロパティを App
クラス内の Page オブジェクトに設定すると、.NET MAUI によって Window オブジェクトが作成されます。 ただし、App
クラス内の CreateWindow
メソッドをオーバーライドして Window オブジェクトを作成することもできます。
namespace MyMauiApp
{
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new MainPage();
}
protected override Window CreateWindow(IActivationState activationState)
{
Window window = base.CreateWindow(activationState);
// Manipulate Window object
return window;
}
}
}
Window クラスには、既定のコンストラクターと、アプリのルート ページを表す Page 引数を受け取るコンストラクターがありますが、基本の CreateWindow
メソッドを呼び出して、.NET MAUI で作成された Window オブジェクトを返すこともできます。
既定では、.NET MAUI アプリは、App
クラスのCreateWindow
メソッドをオーバーライドして、Window オブジェクトを作成します。
namespace MyMauiApp
{
public partial class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState? activationState)
{
return new Window(new AppShell());
}
}
}
Window クラスには、既定のコンストラクターと、アプリのルート ページを表すPage引数を受け取るコンストラクターがあります。
さらに、独自の Window 派生オブジェクトを作成することもできます。
namespace MyMauiApp
{
public class MyWindow : Window
{
public MyWindow() : base()
{
}
public MyWindow(Page page) : base(page)
{
}
// Override Window methods
}
}
その後、App
クラスの CreateWindow
オーバーライドに MyWindow
オブジェクトを作成することで、Window 派生のクラスを使用できます。
Window オブジェクトは、作成方法に関係なく、アプリのルート ページの親になります。
マルチウィンドウのサポート
Android、iPad 上の iOS (iPadOS)、Mac Catalyst、Windows では複数のウィンドウを同時に開くことができます。 これは、Window オブジェクトを作成し、Application
オブジェクトの OpenWindow
メソッドを使用して開くことで実現できます。
Window secondWindow = new Window(new MyPage());
Application.Current?.OpenWindow(secondWindow);
Application.Current.Windows
コレクション は IReadOnlyList<Window>
型で、Application
オブジェクトに登録されているすべての Window オブジェクトへの参照を保持します。
特定のウィンドウは、Application.Current.ActivateWindow
メソッドを使用して Mac Catalyst と Windows の前面に移動できます。
Application.Current?.ActivateWindow(secondWindow);
ウィンドウは、Application.Current.CloseWindow
メソッドを使用して閉じることができます。
// Close a specific window
Application.Current?.CloseWindow(secondWindow);
// Close the active window
Application.Current?.CloseWindow(GetParentWindow());
重要
マルチウィンドウのサポートは、追加の構成なしで Windows で動作します。 ただし、Android、iPadOS と Mac Catalyst では追加の構成が必要になります。
Android の構成
Android でマルチウィンドウのサポートを使用するには、Platforms > Android > MainActivity.cs で MainActivity
起動モードを LaunchMode.SingleTop
から LaunchMode.Multiple
に変更する必要があります。
using Android.App;
using Android.Content.PM;
using Android.OS;
namespace MyMauiApp;
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.Multiple, ...)]
public class MainActivity : MauiAppCompatActivity
{
}
iPadOS と macOS の構成
iPadOS と Mac Catalyst でマルチウィンドウ サポートを使用するには、[プラットフォーム] > [iOS とプラットフォーム] > [MacCatalyst] フォルダーに SceneDelegate
という名前のクラスを追加します。
using Foundation;
using Microsoft.Maui;
using UIKit;
namespace MyMauiApp;
[Register("SceneDelegate")]
public class SceneDelegate : MauiUISceneDelegate
{
}
次に、XML エディターで、[プラットフォーム] > [iOS] > Info.plist ファイルと、[プラットフォーム] > [MacCatalyst] > Info.plist ファイルを開き、各ファイルの末尾に次の XML を追加します。
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<true/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>__MAUI_DEFAULT_SCENE_CONFIGURATION__</string>
<key>UISceneDelegateClassName</key>
<string>SceneDelegate</string>
</dict>
</array>
</dict>
</dict>
重要
iOS for iPhone では、マルチウィンドウのサポートは機能しません。
ウィンドウの位置とサイズ
ウィンドウの位置とサイズは、Window オブジェクトで X
、Y
、Width
、Height
プロパティを設定することで、Windows 上の .NET MAUI アプリに対してプログラムで定義できます。
警告
Mac Catalyst では、X
、Y
、Width
、Height
プロパティを設定することによる、プログラムを使用したウィンドウのサイズ変更や位置変更をサポートしていません。
たとえば、起動時にウィンドウの位置とサイズを設定するには、App
クラス内の CreateWindow
メソッドをオーバーライドし、Window オブジェクトの X
、Y
、Width
、Height
プロパティを設定する必要があります。
public partial class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState activationState) =>
new Window(new AppShell())
{
Width = 700,
Height = 500,
X = 100,
Y = 100
};
}
または、任意のページ、レイアウト、またはビューから Window
プロパティにアクセスすることで、ウィンドウの位置とサイズを設定できます。 たとえば、次のコードは、画面の中央にウィンドウを配置する方法を示しています。
// Get display size
var displayInfo = DeviceDisplay.Current.MainDisplayInfo;
// Center the window
Window.X = (displayInfo.Width / displayInfo.Density - Window.Width) / 2;
Window.Y = (displayInfo.Height / displayInfo.Density - Window.Height) / 2;
デバイスの画面メトリックの取得については、「デバイスの表示情報」をご覧ください。
Mac Catalyst
Mac Catalyst では、プログラムを使用したウィンドウのサイズ変更や位置変更をサポートしていません。 ただし、これを回避してサイズ変更を有効にするには、MinimumWidth
と MaximumWidth
プロパティをウィンドウの目的の幅に設定し、MinimumHeight
と MaximumHeight
プロパティをウィンドウの目的の高さに設定します。 これによりサイズ変更がトリガーされ、プロパティを元の値に戻すことができます。
Window.MinimumWidth = 700;
Window.MaximumWidth = 700;
Window.MinimumHeight = 500;
Window.MaximumHeight = 500;
// Give the Window time to resize
Dispatcher.Dispatch(() =>
{
Window.MinimumWidth = 0;
Window.MinimumHeight = 0;
Window.MaximumWidth = double.PositiveInfinity;
Window.MaximumHeight = double.PositiveInfinity;
});
App クラスからウィンドウ管理を切り離す
IWindowCreator インターフェイスを実装するクラスを作成し、CreateWindow メソッドにウィンドウ管理コードを追加することで、ウィンドウ管理を App
クラスから切り離すことができます。
public class WindowCreator : IWindowCreator
{
public Window CreateWindow(Application app, IActivationState activationState)
{
var window = new Window(new ContentPage
{
Content = new Grid
{
new Label
{
Text = "Hello from IWindowCreator",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center
}
}
});
return window;
}
}
次に、MauiProgram
クラスで、ウィンドウ管理の種類をアプリのサービス コンテナーに依存関係として登録する必要があります。
builder.Services.AddSingleton<IWindowCreator, WindowCreator>();
重要
登録コードで、IWindowCreator
インターフェイスとその具象型が指定されていることを確認します。
次に、App
クラスが MainPage
プロパティを設定していないことを確認します。
public partial class App : Application
{
public App()
{
InitializeComponent();
}
}
IWindowCreator インターフェイスとその具象型がアプリのサービス コンテナーに登録されており、Application クラスの MainPage プロパティが設定されていない場合は、登録された型を使用して Window.を作成します。
.NET MAUI