次の方法で共有


ApplicationView で複数のビューを表示する

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

重要な API: ApplicationViewSwitcher、createNewView

ビューとは何ですか?

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

ビューは、CoreApplication オブジェクトによって管理されます。 CoreApplication.CreateNewView を呼び出して、CoreApplicationView オブジェクトを作成します。 CoreApplicationView は、CoreWindowCoreDispatcher を組み合わせて、CoreWindowDispatcher プロパティに格納します。 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 を追跡します。 これを使用して、後でビューを表示します。

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

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

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

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

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

    最後に、後でビューを表示するために使用する新しいビューの 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 パラメーターは、アプリ内の各ビューを一意に識別する整数です。 ApplicationView.Id プロパティまたは ApplicationView.GetApplicationViewIdForWindow メソッドを使用して、ビュー ID を取得します。

    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
    

メイン ビュー

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

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

副視点

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

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

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

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

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow);

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