.NET MAUI ウィンドウ

.NET Multi-platform App UI (.NET MAUI) Window クラスは、複数のウィンドウを作成、構成、表示、管理する機能を提供します。

Window は次の特性を定義します。

  • FlowDirectionFlowDirection 型で、ウィンドウの UI 要素がレイアウトされる方向を定義します。
  • Heightdouble 型で、Windows 上のウィンドウの高さを指定します。
  • MaximumHeightdouble 型で、デスクトップ プラットフォーム上のウィンドウの最大の高さを表します。 有効な値は、0 から double.PositiveInfinity の範囲です。
  • MaximumWidthdouble 型で、デスクトップ プラットフォーム上のウィンドウの最大の幅を表します。 有効な値は、0 から double.PositiveInfinity の範囲です。
  • MinimumHeightdouble 型で、デスクトップ プラットフォーム上のウィンドウの最小の高さを表します。 有効な値は、0 から double.PositiveInfinity の範囲です。
  • MinimumWidthdouble 型で、デスクトップ プラットフォーム上のウィンドウの最小の幅を表します。 有効な値は、0 から double.PositiveInfinity の範囲です。
  • OverlaysIReadOnlyCollection<IWindowOverlay> 型で、ウィンドウ オーバーレイのコレクションを表します。
  • PagePage 型で、ウィンドウに表示されているページを示します。 このプロパティは、Window クラスのコンテンツ プロパティであるため、明示的に設定する必要はありません。
  • Titlestring 型で、ウィンドウのタイトルを表します。
  • Widthdouble 型で、Windows 上のウィンドウの幅を指定します。
  • Xdouble 型で、Windows 上のウィンドウの X 座標を指定します。
  • Ydouble 型で、Windows 上のウィンドウの Y 座標を指定します。

Overlays プロパティを除き、これらのプロパティはすべて BindableProperty オブジェクトを基盤としています。つまり、これらのプロパティはデータ バインディングの対象になり、スタイルを設定することができます。

Window クラスでは次のイベントを定義します。

  • Created は、ウィンドウの作成時に発生します。
  • Resumed は、ウィンドウがスリープ状態から再開されたときに発生します。
  • Activated は、ウィンドウがアクティブ化されたときに発生します。
  • Deactivated は、ウィンドウが非アクティブ化されたときに発生します。
  • Stopped は、ウィンドウが停止したときに発生します。
  • Destroying は、ウィンドウが破棄されたときに発生します。
  • SizeChanged は、ウィンドウのサイズが変更されたときにデスクトップ プラットフォームで発生します。
  • Backgrounding は、ウィンドウが閉じられるか、バックグラウンド状態になったときに iOS と Mac Catalyst で発生する BackgroundingEventArgs オブジェクトを伴います。 このイベントを使用すると、BackgroundingEventArgs オブジェクトの State プロパティに任意の string 状態を保持できます。この状態は、ウィンドウを再開するまで OS によって保持されます。 ウィンドウが再開されると、IActivationState 引数を使用して状態が CreateWindow メソッドに提供されます。
  • <xref:Microsoft.Maui.Controls.WindowDisplayDensityChanged は、ウィンドウの有効なドット/インチ (DPI) が変更されたときに Android と Windows で発生する DisplayDensityChangedEventArgs オブジェクトを伴います。

ライフサイクル イベントとそれに関連するオーバーライドの詳細については、「アプリのライフサイクル」をご覧ください。

Window クラスでは、次のモーダル ナビゲーション イベントも定義します。

  • ModalPoppedModalPoppedEventArgs 型で、ビューがモーダルにポップされたときに発生します。
  • ModalPoppingModalPoppingEventArgs 型で、ビューがモーダルにポップされたときに発生します。
  • ModalPushedModalPushedEventArgs 型で、ビューがモーダルとしてプッシュされた後に発生します。
  • ModalPushingModalPushingEventArgs 型で、ビューがモーダルにプッシュされたときに発生します。
  • 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 オブジェクトを返すこともできます。

さらに、独自の 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.CloseWindow メソッドを使用して閉じることができます。

// Close a specific window
Application.Current.CloseWindow(secondWindow);

// Close the active window
Application.Current.CloseWindow(GetParentWindow());

重要

マルチウィンドウのサポートは、追加の構成なしで Android と Windows で動作します。 ただし、iPadOS と Mac Catalyst では追加の構成が必要になります。

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 オブジェクトで XYWidthHeight プロパティを設定することで、Windows 上の .NET MAUI アプリに対してプログラムで定義できます。

警告

Mac Catalyst では、XYWidthHeight プロパティを設定することによる、プログラムを使用したウィンドウのサイズ変更や位置変更をサポートしていません。

たとえば、起動時にウィンドウの位置とサイズを設定するには、App クラス内の CreateWindow メソッドをオーバーライドし、Window オブジェクトの XYWidthHeight プロパティを設定する必要があります。

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 では、プログラムを使用したウィンドウのサイズ変更や位置変更をサポートしていません。 ただし、これを回避してサイズ変更を有効にするには、MinimumWidthMaximumWidth プロパティをウィンドウの目的の幅に設定し、MinimumHeightMaximumHeight プロパティをウィンドウの目的の高さに設定します。 これによりサイズ変更がトリガーされ、プロパティを元の値に戻すことができます。

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 を作成します。