ApplicationView を使用して複数のビューを表示する

アプリの独立した部分を別々のウィンドウで表示できるようにすることは、ユーザーが生産性を高めるために役立ちます。 アプリに対して複数のウィンドウを作成すると、各ウィンドウは個別に動作します。 タスク バーには、各ウィンドウが個別に表示されます。 ユーザーはアプリ ウィンドウの移動、サイズ変更、表示、非表示を個別に行うことができます。また、個別のアプリの場合と同じように各アプリ ウィンドウを切り替えることができます。 各ウィンドウは、独自のスレッドで動作します。

重要な API: ApplicationViewSwitcherCreateNewView

ビューとは

アプリのビューは、スレッドとウィンドウが 1:1 で対応したもので、アプリがコンテンツの表示に使います。 これは、 Windows.ApplicationModel.Core.CoreApplicationView オブジェクトによって表されます。

ビューは、 CoreApplication オブジェクトによって管理されます。 CoreApplication.CreateNewView を呼び出して、CoreApplicationView オブジェクトを作成します。 CoreApplicationViewは、CoreWindowCoreDispatcher (CoreWindowおよびDispatcherプロパティに格納されます)。 CoreApplicationView は、Windows ランタイムがコア Windows システムとの対話に使用するオブジェクトと考えることができます。

通常、 CoreApplicationView を直接操作することはできません。 代わりに、Windows ランタイムは、Windows.UI.ViewManagement 名前空間の ApplicationView クラスを提供します。 このクラスは、アプリがウィンドウ システムと対話するときに使用するプロパティ、メソッド、およびイベントを提供します。 ApplicationViewを操作するには、静的ApplicationView.GetForCurrentView メソッドを呼び出します。このメソッドは、現在の CoreApplicationView のスレッドに関連付けられた ApplicationView インスタンスを取得します。

同様に、XAML フレームワークは、Windows.UI.XAML.Window オブジェクト内の CoreWindow オブジェクトをラップします。 XAML アプリでは、通常、CoreWindow を直接操作するのではなく、Window オブジェクトと対話します。

新しいビューを表示する

各アプリのレイアウトはそれぞれ異なりますが、「新しいウィンドウ」ボタンを予測可能な場所に含めることを推奨します。たとえば、新しいウィンドウで開くことができるコンテンツの右上隅などです。 さらに、[新しいウィンドウで開く] ためのコンテキスト メニュー オプションを含めることを検討します。

新しいビューを作成する手順を見てみましょう。 ここでは、ボタンのクリックに応じて新しいビューが起動します。

private async void Button_Click(object sender, RoutedEventArgs e)
{
    CoreApplicationView newView = CoreApplication.CreateNewView();
    int newViewId = 0;
    await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        Frame frame = new Frame();
        frame.Navigate(typeof(SecondaryPage), null);   
        Window.Current.Content = frame;
        // You have to activate the window in order to show it later.
        Window.Current.Activate();

        newViewId = ApplicationView.GetForCurrentView().Id;
    });
    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
}

新しいビューを表示するには

  1. CoreApplication.CreateNewView を呼び出して、ビュー コンテンツの新しいウィンドウとスレッドを作成します。

    CoreApplicationView newView = CoreApplication.CreateNewView();
    
  2. 新しいビューの Id を追跡します。 これを使用して、後でビューを表示します。

    作成したビューの追跡に役立つインフラストラクチャをアプリに組み込む場合があります。 例については、MultipleViews サンプルViewLifetimeControl クラスを参照してください。

    int newViewId = 0;
    
  3. 新しいスレッドで、ウィンドウを設定します。

    CoreDispatcher.RunAsync メソッドを使用して、新しいビューの UI スレッドでの作業をスケジュールします。 lambda 式を使用して関数を引数として RunAsync メソッドに渡します。 ラムダ関数で行う作業は、新しいビューのスレッドで行われます。

    XAML では、通常、WindowContent プロパティにFrameを追加し、アプリコンテンツを定義した XAML PageFrame を移動します。 フレームとページの詳細については、2 ページ間でのピア ツー ピアのナビゲーションに関するページを参照してください。

    新しい Window が設定されたら、後で Window を表示するには、WindowActivate メソッドを呼び出す必要があります。 この作業は新しいビューのスレッドで行われるため、新しい Window がアクティブになります。

    最後に、後でビューを表示するために使用する新しいビューの Id を取得します。 ここでも、この作業は新しいビューのスレッド上にあるため、 ApplicationView.GetForCurrentView は新しいビューの Id を取得します。

    await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        Frame frame = new Frame();
        frame.Navigate(typeof(SecondaryPage), null);   
        Window.Current.Content = frame;
        // You have to activate the window in order to show it later.
        Window.Current.Activate();
    
        newViewId = ApplicationView.GetForCurrentView().Id;
    });
    
  4. ApplicationViewSwitcher.TryShowAsStandaloneAsync を呼び出して、新しいビューを表示します。

    新しいビューを作成した後は、 ApplicationViewSwitcher.TryShowAsStandaloneAsync メソッドを呼び出して、新しいウィンドウに表示できます。 このメソッドの viewId パラメーターは、アプリ内の各ビューを一意に識別する整数です。 ビュー Id を取得するには、 ApplicationView.Id プロパティまたは ApplicationView.GetApplicationViewIdForWindow メソッドを使用します。

    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
    

メイン ビュー

アプリの起動時に最初に作成されるビューは、メイン ビューと呼ばれます。 このビューは CoreApplication.MainView プロパティに格納され、その IsMain プロパティは true です。 このビューは作成しません。アプリによって作成されます。 メイン ビューのスレッドはアプリのマネージャーとして機能し、すべてのアプリアクティブ化イベントはこのスレッドで配信されます。

セカンダリ ビューが開いている場合、メイン ビューのウィンドウを非表示にすることができます。たとえば、ウィンドウのタイトル バーの [閉じる ] (x) ボタンをクリックすると、そのスレッドはアクティブなままです。 メイン ビューの WindowClose を呼び出すと、InvalidOperationExceptionが発生します。 ( を使用するApplication.Exit アプリを閉じます。メイン ビューのスレッドが終了すると、アプリは閉じます。

セカンダリ ビュー

アプリ コードで CreateNewView を呼び出して作成するすべてのビューを含む、その他のビューはセカンダリ ビューです。 メイン ビューとセカンダリ ビューの両方が、 CoreApplication.Views コレクションに格納されます。 通常、ユーザー アクションに応答してセカンダリ ビューを作成します。 場合によっては、システムによってアプリのセカンダリ ビューが作成されます。

Note

Windows 割り当てられたアクセス 機能を使用して、 kiosk モードでアプリを実行。 これを行うと、システムによってセカンダリ ビューが作成され、ロック画面の上にアプリ UI が表示されます。 アプリで作成されたセカンダリ ビューは許可されないため、キオスク モードで独自のセカンダリ ビューを表示しようとすると、例外がスローされます。

1 つのビューから別のビューに切り替える

ユーザーがセカンダリ ウィンドウから親ウィンドウに戻る方法を提供することを検討してください。 これを行うには、 ApplicationViewSwitcher.SwitchAsync メソッドを使用します。 切り替えるウィンドウのスレッドからこのメソッドを呼び出し、切り替えるウィンドウのビュー ID を渡します。

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow);

SwitchAsync を使用する場合は、初期ウィンドウを閉じてタスク バーから削除するかどうかを選択できます。そのためには、ApplicationViewSwitchingOptions の値を指定します。