Erweiterte Szenarien für XAML Islands in C++-Desktop (Win32)-Apps

Wichtig

In diesem Thema werden Typen aus dem GitHub-Repository CommunityToolkit/Microsoft.Toolkit.Win32 verwendet oder erwähnt. Wichtige Informationen zur Unterstützung von XAML Islands finden Sie in diesem Repository im Hinweis zu XAML Islands.

In den Artikeln Hosten eines UWP-Standardsteuerelements und Hosten eines benutzerdefinierten UWP-Steuerelements wurden Anweisungen und Beispiele zum Hosten von XAML Islands in einer C++-Desktop (Win32)-App bereitgestellt. Die Codebeispiele in diesen Artikeln decken jedoch keine fortgeschrittenen Szenarien ab, die Desktopanwendungen möglicherweise unterstützen müssen, um ein reibungsloses Benutzererlebnis zu ermöglichen. Der vorliegende Artikel bietet Anleitungen für einige dieser Szenarien sowie Verweise auf zugehörige Codebeispiele.

Tastatureingabe

Um Tastatureingaben für XAML Islands ordnungsgemäß verarbeiten zu können, muss deine Anwendung alle Windows-Meldungen an das UWP-XAML-Framework übergeben, sodass bestimmte Nachrichten richtig verarbeitet werden können. Wandle hierzu an einigen Stellen in deiner Anwendung mit Zugriff auf die Nachrichtenschleife das DesktopWindowXamlSource-Objekt in eine IDesktopWindowXamlSourceNative2-COM-Schnittstelle um. Rufe anschließend die PreTranslateMessage-Methode dieser Schnittstelle auf, und übergib die aktuelle Nachrichtenschleife.

Navigation mit Tastaturfokus

Wenn der Benutzer mithilfe der Tastatur durch die Benutzeroberflächenelemente in deiner Anwendung navigiert (beispielsweise durch Drücken der TAB-Taste oder mithilfe der Richtungs-/Pfeiltasten), musst du den Fokus programmgesteuert in das und aus dem DesktopWindowXamlSource-Objekt verlagern. Wenn der Benutzer bei der Tastaturnavigation DesktopWindowXamlSource erreicht, verlagere den Fokus in das erste Windows.UI.Xaml.UIElement-Element in der Navigationsreihenfolge für deine Benutzeroberfläche. Fahre fort, den Fokus auf die folgenden Windows.UI.Xaml.UIElement Objekte zu verlagern, während der Benutzer die Elemente durchläuft, und bewege dann den Fokus zurück aus DesktopWindowXamlSource und in das übergeordnete Benutzeroberflächenelement.

Die UWP-XAML-Hosting-API stellt verschiedene Typen und Member bereit, um diese Aufgaben auszuführen.

  • Wenn die Tastaturnavigation DesktopWindowXamlSource erreicht, wird das Ereignis GotFocus ausgelöst. Verarbeite dieses Ereignis, und verlagere den Fokus programmgesteuert auf das erste gehostete Windows.UI.Xaml.UIElement, indem du die NavigateFocus-Methode verwendest.

  • Wenn der Benutzer das letzte Element in DesktopWindowXamlSource erreicht, das den Fokus erhalten kann, und die TAB-Taste oder eine Pfeiltaste drückt, wird das TakeFocusRequested-Ereignis ausgelöst. Verarbeite dieses Ereignis, und verschiebe den Fokus programmgesteuert auf das nächste Element in der Hostanwendung, das den Fokus erhalten kann. Beispielsweise kannst du in einer WPF-Anwendung, bei der DesktopWindowXamlSource in einem System.Windows.Interop.HwndHost gehostet wird, den Fokus mithilfe der Methode MoveFocus auf das nächste Element in der Hostanwendung verlagern, das den Fokus erhalten kann.

Beispiele zur Veranschaulichung dieses Vorgangs im Kontext einer funktionierenden Beispielanwendung findest du in den folgenden Codedateien:

Verarbeiten von Layoutänderungen

Wenn der Benutzer die Größe des übergeordneten Benutzeroberflächenelements ändert, musst du die erforderlichen Layoutänderungen verarbeiten, damit die UWP-Steuerelemente wie erwartet angezeigt werden. Nachfolgend werden einige wichtige Szenarien aufgeführt, die zu berücksichtigen sind.

  • In einer C++-Desktop-Anwendung kann Ihre Anwendung beim Verarbeiten der WM_SIZE-Nachricht das gehostete XAML Islands-Element mit der Funktion SetWindowPos neu positionieren. Ein Beispiel hierzu findest du in der Codedatei SampleApp.cpp.

  • Wenn das übergeordnete Benutzeroberflächenelement die Größe des rechteckigen Bereichs annehmen muss, die für das in DesktopWindowXamlSource gehostete Windows.UI.Xaml.UIElement benötigt wird ist, rufe die Measure-Methode von Windows.UI.Xaml.UIElement auf. Beispiel:

  • Wenn sich die Größe des übergeordneten Benutzeroberflächenelements ändert, rufe die Arrange-Methode für das Windows.UI.Xaml.UIElement auf, das du in DesktopWindowXamlSource hostest. Beispiel:

    • In einer WPF-Anwendung kannst du hierzu die ArrangeOverride-Methode von HwndHost verwenden, der DesktopWindowXamlSource hostet. Ein Beispiel findest du in der Datei WindowsXamlHost.Layout.cs im Windows-Community-Toolkit.

    • In einer Windows Forms-Anwendung kannst du hierzu möglicherweise den Handler für das SizeChanged-Ereignis des Control-Elements verwenden, das DesktopWindowXamlSource hostet. Ein Beispiel findest du in der Datei WindowsXamlHost.Layout.cs im Windows-Community-Toolkit.

Verarbeiten von DPI-Änderungen

Das UWP-XAML-Framework verarbeitet DPI-Änderungen für gehostete UWP-Steuerelemente automatisch (beispielsweise, wenn der Benutzer das Fenster per von einem Monitor zu einem anderen Monitor mit unterschiedlichem DPI-Wert zieht). Für optimale Ergebnisse wird empfohlen, Ihre Windows Forms-, WPF- oder C++-Desktop-Anwendung so zu konfigurieren, dass sie den DPI-Wert des jeweiligen Monitors berücksichtigt.

Um deine Anwendung entsprechend zu konfigurieren, fügst du deinem Projekt ein paralleles Assemblymanifest hinzu und legst das Element <dpiAwareness>-Element auf PerMonitorV2 fest. Weitere Informationen zu diesem Wert findest du in der Beschreibung für 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>