Partager via


Scénarios avancés pour XAML Islands dans les applications de bureau C++ (Win32)

Important

Cette rubrique utilise ou mentionne des types du dépôt GitHub CommunityToolkit/Microsoft.Toolkit.Win32. Pour obtenir des informations importantes sur la prise en charge de XAML Islands, consultez l’avis XAML Islands dans ce dépôt.

Les articles Héberger un contrôle UWP standard et Héberger un contrôle UWP personnalisé fournissent des instructions et des exemples d’hébergement XAML Islands dans une application de bureau C++ (Win32). Toutefois, les exemples de codes de ces articles n’abordent pas de nombreux scénarios avancés que les applications de bureau peuvent avoir à gérer pour offrir une expérience utilisateur fluide. Cet article fournit des conseils sur certains de ces scénarios ainsi que des pointeurs vers des exemples de code connexes.

Saisie au clavier

Pour gérer correctement la saisie au clavier pour chaque élément XAML Island, votre application doit transmettre tous les messages Windows à l’infrastructure XAML UWP afin que certains messages puissent être traités correctement. Pour cela, à certains endroits de votre application qui peuvent accéder à la boucle de message, convertissez l’objet DesktopWindowXamlSource pour chaque élément XAML Island en une interface COM IDesktopWindowXamlSourceNative2. Appelez ensuite la méthode PreTranslateMessage de cette interface et transmettez le message actuel.

  • Application de bureau C++ (Win32) : L’application peut appeler PreTranslateMessage directement dans sa boucle de message principale. Pour obtenir un exemple, consultez le fichier XamlBridge.cpp.

  • WPF : L’application peut appeler PreTranslateMessage à partir du gestionnaire d’événements pour l’événement ComponentDispatcher.ThreadFilterMessage. Pour obtenir un exemple, consultez le fichier WindowsXamlHostBase.Focus.cs dans le Kit de ressources Communauté Windows.

  • Windows Forms : L’application peut appeler PreTranslateMessage à partir d’un remplacement de la méthode Control.PreprocessMessage. Pour obtenir un exemple, consultez le fichier WindowsXamlHostBase.KeyboardFocus.cs dans le Kit de ressources Communauté Windows.

Navigation au clavier en mode focus

Lorsque l’utilisateur parcourt les éléments d’interface utilisateur de votre application à l’aide du clavier (par exemple, en appuyant sur la touche Tab ou la touche direction/flèche), vous devez placer par programmation le focus dans et hors de l’objet DesktopWindowXamlSource. Lorsque la navigation au clavier de l’utilisateur atteint l’objet DesktopWindowXamlSource, placez le focus sur le premier objet Windows.UI.Xaml.UIElement dans l’ordre de navigation de votre interface utilisateur, continuez à placer le focus sur les objets Windows.UI.Xaml.UIElement suivants lorsque l’utilisateur parcourt les éléments, puis placez le focus hors de l’objet DesktopWindowXamlSource et dans l’élément d’interface utilisateur parent.

L’API d’hébergement XAML UWP fournit plusieurs types et membres pour vous aider à accomplir ces tâches.

  • Quand la navigation au clavier atteint votre objet DesktopWindowXamlSource, l’événement GotFocus est déclenché. Gérez cet événement et placez par programmation le focus sur le premier objet Windows.UI.Xaml.UIElement hébergé à l’aide de la méthode NavigateFocus.

  • Lorsque l’utilisateur se trouve sur le dernier élément pouvant être actif dans votre objet DesktopWindowXamlSource et appuie sur la touche Tab ou sur une touche de direction, l’événement TakeFocusRequested est déclenché. Gérez cet événement et placez par programmation le focus sur le prochain élément pouvant être actif dans l’application hôte. Par exemple, dans une application WPF où DesktopWindowXamlSource est hébergé dans un objet System.Windows.Interop.HwndHost, vous pouvez utiliser la méthode MoveFocus pour déplacer le focus vers le prochain élément pouvant être actif dans l’application hôte.

Pour obtenir des exemples montrant comment effectuer cette opération dans le contexte d’un exemple d’application fonctionnel, consultez les fichiers de code suivants :

Gérer les modifications de disposition

Lorsque l’utilisateur modifie la taille de l’élément d’interface utilisateur parent, vous devez gérer les modifications de disposition nécessaires pour vous assurer que vos contrôles UWP s’affichent comme prévu. Voici quelques scénarios importants à prendre en compte.

  • Dans une application de bureau C++, lorsque votre application gère le message WM_SIZE, elle peut repositionner l’élément XAML Islands hébergé à l’aide de la fonction SetWindowPos. Pour obtenir un exemple, consultez le fichier de code SampleApp.cpp.

  • Lorsque l’élément d’interface utilisateur parent doit obtenir la taille de la zone rectangulaire nécessaire pour ajuster l’objet Windows.UI.Xaml.UIElement que vous hébergez sur DesktopWindowXamlSource, appelez la méthode Measure de Windows.UI.Xaml.UIElement. Par exemple :

    • Dans une application WPF, vous pouvez effectuer cette opération à partir de la méthode MeasureOverride de l’objet HwndHost qui héberge DesktopWindowXamlSource. Pour obtenir un exemple, consultez le fichier WindowsXamlHostBase.Layout.cs dans le Kit de ressources Communauté Windows.

    • Dans une application Windows Forms, vous pouvez effectuer cette opération à partir de la méthode GetPreferredSize de l’objet Control qui héberge DesktopWindowXamlSource. Pour obtenir un exemple, consultez le fichier WindowsXamlHostBase.Layout.cs dans le Kit de ressources Communauté Windows.

  • Lorsque la taille de l’élément d’interface utilisateur parent change, appelez la méthode Arrange de l’objet Windows.UI.Xaml.UIElement que vous hébergez sur DesktopWindowXamlSource. Par exemple :

    • Dans une application WPF, vous pouvez effectuer cette opération à partir de la méthode ArrangeOverride de l’objet HwndHost qui héberge DesktopWindowXamlSource. Pour obtenir un exemple, consultez le fichier WindowsXamlHost.Layout.cs dans le Kit de ressources Communauté Windows.

    • Dans une application Windows Forms, vous pouvez effectuer cette opération à partir du gestionnaire pour l’événement SizeChanged de l’objet Control qui héberge DesktopWindowXamlSource. Pour obtenir un exemple, consultez le fichier WindowsXamlHost.Layout.cs dans le Kit de ressources Communauté Windows.

Gérer les changements de résolutions (DPI)

L’infrastructure XAML UWP gère automatiquement les changements de DPI pour les contrôles UWP hébergés (par exemple, lorsque l’utilisateur fait glisser la fenêtre entre des moniteurs affichant des résolutions DPI différentes). Pour une expérience optimale, nous vous recommandons de configurer votre application Windows Forms, votre application WPF ou votre application de bureau C++ de manière à prendre en charge la résolution par moniteur.

Pour configurer votre application afin de prendre charge la résolution par moniteur, ajoutez un manifeste d’assembly côte à côte à votre projet, puis définissez l’élément <dpiAwareness> sur PerMonitorV2. Pour plus d’informations sur cette valeur, consultez la description de 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>