C++ 傳統型 (Win32) 應用程式的進階 XAML Island 的案例

重要

本主題使用或提及來自 CommunityToolkit/Microsoft.Toolkit.Win32 GitHub 存放庫的類型。 如需 XAML Islands 支援的重要資訊,請參閱該存放庫的 XAML Islands 注意事項

裝載標準 UWP 控制項裝載自訂 UWP 控制項文章均提供在 C++ 傳統型 (Win32) 應用程式中裝載 XAML Islands 的指示和範例。 不過,這些文章中的程式碼範例不會處理許多進階案例,而傳統型應用程式可能需要處理這類案例,才能提供順暢的使用者體驗。 此文章提供這其中部分案例的指導方針,以及相關程式碼範例的指標。

鍵盤輸入

若要針對每個 XAML Island 適當地處理鍵盤輸入,您的應用程式必須將所有的 Windows 訊息傳遞到 UWP XAML 架構,才能正確處理特定訊息。 若要這樣做,在應用程式中某個可存取訊息迴圈的位置上,將適用於每個 XAML Island 的 DesktopWindowXamlSource 物件轉換為 IDesktopWindowXamlSourceNative2 COM 介面。 然後,呼叫此介面的 PreTranslateMessage 方法,並傳入目前的訊息。

鍵盤焦點瀏覽

當使用者使用鍵盤來瀏覽應用程式中的 UI 元素時 (例如,按 Tab 鍵或方向鍵) 時,您必須以程式設計方式將焦點移入和移出 DesktopWindowXamlSource 物件。 當使用者的鍵盤瀏覽到達 DesktopWindowXamlSource 時,將焦點移至 UI 瀏覽順序中的第一個 Windows.UI.Xaml.UIElement 物件、當使用者循環瀏覽元素時繼續將焦點移至後續的 Windows.UI.Xaml.UIElement 物件,接著將焦點移回到 DesktopWindowXamlSource 及父 UI 元素。

UWP XAML 裝載 API 提供數種類型和成員,可協助您完成這些工作。

  • 當鍵盤瀏覽進入您的 DesktopWindowXamlSource 時,就會引發 GotFocus \(英文\) 事件。 處理此事件,並使用 NavigateFocus 方法,以程式設計方式將焦點移至第一個裝載的 Windows.UI.Xaml.UIElement

  • 當使用者位於您的 DesktopWindowXamlSource 中最後一個可設定焦點的元素上,並按 Tab 鍵或方向鍵時,就會引發 TakeFocusRequested \(英文\) 事件。 處理此事件,並以程式設計方式將焦點移至主控件應用程式中下一個可設定焦點的元素。 例如,在 DesktopWindowXamlSource 裝載於 System.Windows.Interop.HwndHost \(部分機器翻譯\) 的 WPF 應用程式中,您可以使用 MoveFocus \(部分機器翻譯\) 方法,以將焦點轉移到主控件應用程式中下一個可設定焦點的元素。

如需示範如何在運作中範例應用程式的內容中執行此操作的範例,請參閱下列程式碼檔案:

處理版面配置變更

當使用者變更父 UI 元素的大小時,您必須處理任何必要的版面配置變更,以確保您的 UWP 控制項會如預期般顯示。 以下是一些需要考慮的重要案例。

  • 在 C++ 傳統型應用程式中,當您的應用程式處理 WM_SIZE 訊息時,可以使用 SetWindowPos 函式重新置放裝載的 XAML Island。 如需範例,請參閱 SampleApp.cpp 程式碼檔案。

  • 當父 UI 元素需要取得所需的矩形區域大小以符合您在 DesktopWindowXamlSource 上所裝載的 Windows.UI.Xaml.UIElement 時,請呼叫 Windows.UI.Xaml.UIElementMeasure 方法。 例如:

  • 當父 UI 元素的大小變更時,請呼叫您裝載於 DesktopWindowXamlSource 上根 Windows.UI.Xaml.UIElementArrange 方法。 例如:

處理 DPI 變更

UWP XAML 架構會針對裝載的 UWP 控制項自動處理 DPI 變更 (例如,當使用者在具有不同螢幕 DPI 的監視器之間拖曳視窗時)。 為了獲得最佳體驗,我們建議您將 Windows Forms、WPF 或 C++ 傳統型應用程式設定為個別監視器 DPI 感知。

若要將應用程式設定為個別監視器 DPI 感知,請將並存組件資訊清單 \(英文\) 新增到您的專案,並將 <dpiAwareness> 元素設定為 PerMonitorV2。 如需此值的詳細資訊,請參閱 DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 的描述。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
        </windowsSettings>
    </application>
</assembly>