共用方式為


使用 ApplicationView 顯示多重檢視

讓使用者在個別的視窗中檢視您 app 的獨立部分,以協助他們提高生產力。 當您為應用程式建立多個視窗時,每個視窗的行為都是獨立的。 工作列會分別顯示每個視窗。 使用者可以獨立移動、調整大小、顯示和隱藏應用程式視窗,並且可以在應用程式視窗之間切換,就像它們是單獨的應用程式一樣。 每個視窗都會在自己的執行緒中執行。

重要 APIApplicationViewSwitcherCreateNewView

什麼是檢視?

應用程式檢視是應用程式用來顯示內容的執行緒和視窗的 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 架構將 CoreWindow 物件包裝在 Windows.UI.XAML.Window 物件中。 在 XAML 應用程式中,通常是與 Window 物件互動,而不是直接使用 CoreWindow

顯示新的檢視

每個 app 都有獨一無二的配置,不過建議在常見位置放置「新增視窗」按鈕,例如可於新視窗中開啟的內容右上角。 也請考慮納入 操作功能表 選項,以「在新視窗中 開啟」。

我們來看看建立新檢視的步驟。 在這裡,會啟動新的檢視,以回應按鈕點擊。

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. 追蹤新檢視的識別碼。 稍後您可以使用它來顯示檢視。

    您可能需要考慮在應用程式中建立一些基礎結構,以協助追蹤您建立的檢視。 有關範例,請參閱 MultipleViews 範例中的 ViewLifetimeControl 類別。

    int newViewId = 0;
    
  3. 在新執行緒上,填入視窗。

    您可以使用 CoreDispatcher.RunAsync 方法來排程新檢視 UI 執行緒上的工作。 您可以使用 lambda 運算式將函式作為參數傳遞給 RunAsync 方法。 您在 Lamdba 函式中進行的工作會在新檢視的執行緒上發生。

    在 XAML 中,您通常會將 Frame 新增到 WindowContent 屬性,然後將 Frame 導覽到您已定義 app 內容的 XAML Page。 如需框架與頁面的詳細資訊,請參閱兩個頁面之間的對等瀏覽

    填入新視窗後,必須呼叫視窗Activate 方法才能稍後顯示該視窗。 這項工作發生在新檢視的執行緒上,因此會啟動新視窗

    最後,取得新檢視的識別碼,以用來在稍後顯示該檢視。 同樣,這項工作是在新檢視的執行緒上進行的,因此 ApplicationView.GetForCurrentView 會取得新檢視的識別碼

    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) 按鈕),但是其執行緒會維持為使用中。 在主要檢視的 Window 上呼叫 Close 會導致發生 InvalidOperationException。 (使用 Application.Exit 關閉您的應用程式。) 如果主要檢視的執行緒終止,則應用程式關閉。

次要檢視

其他檢視,包括您透過在應用程式程式碼中呼叫 CreateNewView 所建立的所有檢視,都是次要檢視。 主要檢視和次要檢視都儲存在 CoreApplication.Views 集合中。 通常,您會建立次要檢視以回應使用者動作。 在某些情況下,系統會為您的應用程式建立次要檢視。

注意

您可以使用 Windows 指派的存取功能在 kiosk 模式下執行應用程式。 當您執行此操作時,系統會建立次要檢視,以在鎖定畫面上方顯示您的應用程式 UI。 不允許使用應用程式建立的次要檢視,因此如果您嘗試在 kiosk 模式下顯示自己的次要檢視,則會擲回例外狀況。

從一種檢視切換到另一種檢視

考慮提供一個方法,讓使用者能夠從次要視窗瀏覽回其父視窗。 若要這樣做,請使用 ApplicationViewSwitcher.SwitchAsync 方法。 您可以從要切換的視窗的執行緒呼叫此方法,並傳遞要切換到的視窗的檢視識別碼。

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow);

使用 SwitchAsync 時,可以透過指定 ApplicationViewSwitchingOptions 的值來選擇是否要關閉初始視窗,並將其從工作列中移除。