Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 sur l'hébergement d'un contrôle UWP standard et d'un contrôle UWP personnalisé fournissent des instructions et des exemples pour héberger des XAML Islands dans une application de bureau C++ (Win32). Toutefois, les exemples de code de ces articles ne gèrent pas de nombreux scénarios avancés que les applications de bureau peuvent avoir besoin de gérer pour offrir une expérience utilisateur fluide. Cet article fournit des conseils pour certains de ces scénarios et des pointeurs vers des exemples de code associés.
Entrée du clavier
Pour gérer correctement l’entrée du clavier pour chaque île XAML, votre application doit transmettre tous les messages Windows à l’infrastructure XAML UWP afin que certains messages puissent être traités correctement. Pour ce faire, à un endroit de votre application capable d'accéder à la boucle de messages, convertissez l'objet DesktopWindowXamlSource de chaque île XAML en interface COM IDesktopWindowXamlSourceNative2. Ensuite, appelez la méthode PreTranslateMessage de cette interface et transmettez le message actuel.
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 windows Community Toolkit.
Windows Forms : L’application peut appeler PreTranslateMessage à partir d’un remplacement pour la méthode Control.PreprocessMessage . Pour obtenir un exemple, consultez le fichier WindowsXamlHostBase.KeyboardFocus.cs dans windows Community Toolkit.
Navigation du focus du clavier
Lorsque l’utilisateur navigue dans les éléments de l’interface utilisateur de votre application à l’aide du clavier (par exemple, en appuyant sur Tab ou une touche flèche directionnelle), vous devez déplacer le focus par programmation vers et depuis l’objet DesktopWindowXamlSource. Lorsque la navigation au clavier de l’utilisateur atteint DesktopWindowXamlSource, déplacez le focus sur le premier objet Windows.UI.Xaml.UIElement dans l’ordre de navigation de votre interface utilisateur, continuez à déplacer le focus vers les objets Windows.UI.Xaml.UIElement suivants à mesure que l’utilisateur parcoure les éléments, puis déplacez le focus sur 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.
Lorsque la navigation au clavier entre dans votre DesktopWindowXamlSource, l’événement GotFocus est déclenché. Gérez cet événement et déplacez le focus par programmation vers le premier windows.UI.Xaml.UIElement hébergé à l’aide de la méthode NavigateFocus .
Lorsque l’utilisateur se trouve sur le dernier élément focusable dans votre DesktopWindowXamlSource et appuie sur la touche Tab ou une des touches fléchées, l’événement TakeFocusRequested est déclenché. Gérez cet événement et déplacez le focus par programmation vers l’élément focusable suivant dans l’application hôte. Par exemple, dans une application WPF où DesktopWindowXamlSource est hébergé dans un System.Windows.Interop.HwndHost, vous pouvez utiliser la méthode MoveFocus pour transférer le focus vers l’élément focusable suivant dans l’application hôte.
Pour obtenir des exemples qui montrent comment procéder dans le contexte d’un exemple d’application fonctionnel, consultez les fichiers de code suivants :
Bureau C++ (Win32) : consultez le fichier XamlBridge.cpp .
WPF: Consultez le fichier WindowsXamlHostBase.Focus.cs dans windows Community Toolkit.
Windows Forms : Consultez le fichier WindowsXamlHostBase.KeyboardFocus.cs dans windows Community Toolkit.
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 il peut repositionner l’île XAML hébergée à 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 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 le faire à partir de la méthode MeasureOverride du HwndHost qui héberge DesktopWindowXamlSource. Pour obtenir un exemple, consultez le fichier WindowsXamlHostBase.Layout.cs dans windows Community Toolkit.
Dans une application Windows Forms, vous pouvez le faire à partir de la méthode GetPreferredSize du contrôle qui héberge DesktopWindowXamlSource. Pour obtenir un exemple, consultez le fichier WindowsXamlHostBase.Layout.cs dans windows Community Toolkit.
Lorsque la taille de l’élément d’interface utilisateur parent change, appelez la méthode Arrange de la racine Windows.UI.Xaml.UIElement que vous hébergez sur DesktopWindowXamlSource. Par exemple:
Dans une application WPF, vous pouvez le faire à 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 windows Community Toolkit.
Dans une application Windows Forms, vous pouvez le faire à partir du gestionnaire pour l’événement SizeChanged du Contrôle qui héberge DesktopWindowXamlSource. Pour obtenir un exemple, consultez le fichier WindowsXamlHost.Layout.cs dans windows Community Toolkit.
Gérer les modifications DPI
L’infrastructure XAML UWP gère automatiquement les modifications DPI pour les contrôles UWP hébergés (par exemple, lorsque l’utilisateur fait glisser la fenêtre entre les moniteurs avec différents PPP d’écran). Pour une expérience optimale, nous vous recommandons de configurer votre application de bureau Windows Forms, WPF ou C++ afin qu’elle soit consciente de la DPI par moniteur.
Pour configurer votre application pour qu’elle prenne en charge le DPI par moniteur, ajoutez un manifeste d’assembly côte à côte à votre projet et 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>
Rubriques connexes
- Héberger des contrôles XAML UWP dans des applications de bureau (îlots XAML)
- Utilisation de l’API d’hébergement XAML UWP dans une application de bureau C++
- Héberger un contrôle UWP standard dans une application de bureau C++
- Héberger un contrôle UWP personnalisé dans une application de bureau C++
- Exemples de code XAML Islands
- Exemple de bureau XAML Islands pour C++