Partager via


Dépannage des applications hybrides

Mise à jour : novembre 2007

Cette rubrique décrit quelques problèmes courants qui peuvent se produire lors de la création d'applications hybrides qui utilisent à la fois les technologies WPF et Windows Forms.

Contrôles superposés

Les contrôles ne se superposent peut-être pas comme ils devraient. Les Windows Forms utilisent un handle de fenêtre (HWND) séparé pour chaque contrôle. WPF utilise un HWND pour tout le contenu d'une page. Cette différence d'implémentation provoque des comportements de superposition inattendus.

Un contrôle Windows Forms hébergé dans WPF apparaît toujours au-dessus du contenu WPF.

Le contenu WPF hébergé dans un contrôle ElementHost apparaît dans l'ordre de plan du contrôle ElementHost. Il est possible de superposer les contrôles ElementHost, mais le contenu WPF hébergé ne se mélange pas et n'interagit pas.

Propriété Child

Les classes WindowsFormsHost et ElementHost peuvent héberger uniquement un seul contrôle ou élément enfant. Pour héberger plusieurs contrôles ou éléments, vous devez utiliser un conteneur comme contenu enfant. Par exemple, vous pouvez ajouter des contrôles bouton et case à cocher Windows Forms à un contrôle System.Windows.Forms.Panel, puis assigner le panneau à la propriété Child du contrôle WindowsFormsHost. Toutefois, vous ne pouvez pas ajouter les contrôles bouton et case à cocher séparément au même contrôle WindowsFormsHost.

Mise à l'échelle

WPF et les Windows Forms possèdent des modèles de mise à l'échelle différents. Certaines transformations de mise à l'échelle WPF sont explicites pour les contrôles Windows Forms, mais d'autres ne le sont pas. Par exemple, il est possible de mettre un contrôle Windows Forms à 0, mais si vous essayez de mettre à l'échelle le même contrôle pour lui redonner une valeur autre que zéro, la taille de contrôle reste 0. Pour plus d'informations, consultez Considérations sur la disposition de l'élément WindowsFormsHost.

Adaptateur

L'utilisation des classes WindowsFormsHost et ElementHost peut provoquer une confusion, car elles comprennent un conteneur masqué. Ces deux classes, WindowsFormsHost et ElementHost, possèdent un conteneur masqué appelé adaptateur, qu'elles utilisent pour héberger du contenu. Pour l'élément WindowsFormsHost, l'adaptateur dérive de la classe System.Windows.Forms.ContainerControl. Pour le contrôle ElementHost, l'adaptateur dérive de l'élément DockPanel. Lorsque vous voyez des références à l'adaptateur dans d'autres rubriques d'interopérabilité, il est question de ce conteneur.

Imbrication

L'imbrication d'un élément WindowsFormsHost dans un contrôle ElementHost n'est pas prise en charge. L'imbrication d'un contrôle ElementHost dans un élément WindowsFormsHost n'est pas prise en charge non plus.

Focus

Le focus fonctionne différemment dans WPF et dans les Windows Forms, ce qui peut provoquer des problèmes de focus dans une application hybride. Par exemple, si vous avez le focus dans un élément WindowsFormsHost et que vous diminuez et restaurez la page ou que vous affichez une boîte de dialogue modale, le focus dans l'élément WindowsFormsHost risque d'être perdu. L'élément WindowsFormsHost conserve le focus, mais ce n'est peut-être pas le cas pour le contrôle.

La validation des données est également affectée par le focus. Elle fonctionne dans un élément WindowsFormsHost, mais pas lorsque vous sortez de l'élément WindowsFormsHost, ni entre deux éléments WindowsFormsHost différents.

Mappage de propriétés

Certains mappages de propriétés nécessitent une interprétation approfondie pour lier des implémentations différentes entre les technologies WPF et Windows Forms. Les mappages de propriétés permettent à votre code de réagir aux changements de polices, de couleurs et d'autres propriétés. En général, les mappages de propriétés fonctionnent en écoutant soit les événements propriétéChanged, soit les appels OnpropriétéChanged, puis en configurant les propriétés adéquates sur le contrôle enfant ou son adaptateur. Pour plus d'informations, consultez Mappage de propriétés Windows Forms et WPF.

Propriétés relatives à la disposition sur le contenu hébergé

Lorsque la propriété WindowsFormsHost.Child ou ElementHost.Child est assignée, plusieurs propriétés relatives à la disposition sur le contenu hébergé sont automatiquement configurées. La modification de ces propriétés peut provoquer des comportements de disposition inattendus.

Votre contenu hébergé est ancré pour remplir le parent WindowsFormsHost et ElementHost. Pour activer ce comportement de remplissage, plusieurs propriétés sont configurées lorsque vous définissez la propriété enfant. Le tableau suivant répertorie les propriétés de contenu qui sont définies par les classes ElementHost et WindowsFormsHost.

Classe de l'hôte

Propriétés de contenu

ElementHost

Height

Width

Margin

VerticalAlignment

HorizontalAlignment

WindowsFormsHost

Margin

Dock

AutoSize

Location

MaximumSize

Vous ne devez pas définir ces propriétés directement sur le contenu hébergé. Pour plus d'informations, consultez Considérations sur la disposition de l'élément WindowsFormsHost.

Applications de navigation

Les applications de navigation ne conservent pas toujours l'état utilisateur. L'élément WindowsFormsHost recrée ses contrôles lorsqu'il est utilisé dans une application de navigation. Les contrôles enfants sont recréés lorsque l'utilisateur quitte la page hébergeant l'élément WindowsFormsHost, puis l'affiche de nouveau. Tout contenu entré par l'utilisateur sera perdu.

Interopérabilité des boucles de messages

Lorsque vous utilisez les boucles de messages des Windows Forms, les messages peuvent ne pas être traités comme prévu. La méthode EnableWindowsFormsInterop est appelée par le constructeur WindowsFormsHost. Cette méthode ajoute un filtre de message à la boucle de messages WPF. Ce filtre appelle la méthode Control.PreProcessMessage si System.Windows.Forms.Control était la cible du message, puis traduit/distribue le message.

Si vous affichez un Window dans une boucle de messages Windows Forms avec Application.Run, vous ne pouvez rien entrer sauf si vous appelez la méthode EnableModelessKeyboardInterop. La méthode EnableModelessKeyboardInterop prend un Window et ajoute un System.Windows.Forms.IMessageFilter qui redirige les messages relatifs aux clés vers la boucle de messages WPF. Pour plus d'informations, consultez Architecture d'entrée pour l'interopérabilité entre Windows Forms et WPF.

Opacité et superposition

La classe HwndHost ne prend pas en charge la superposition. Cela signifie que la configuration de la propriété Opacity sur l'élément WindowsFormsHost n'a aucun effet, et aucune fusion ne sera effectuée avec d'autres fenêtres WPF dont la propriété AllowsTransparency a la valeur true.

Suppression

Si vous ne supprimez pas correctement les classes, cela peut entraîner une fuite des ressources. Dans vos applications hybrides, vérifiez que les classes WindowsFormsHost et ElementHost sont supprimées, sinon une fuite des ressources risque de se produire. Windows Forms supprime les contrôles ElementHost lorsque son parent Form non modal se ferme. WPF supprime les éléments WindowsFormsHost lorsque votre application s'arrête. Il est possible d'afficher un élément WindowsFormsHost dans un Window dans une boucle de messages Windows Forms. Dans ce cas, votre code ne recevra peut-être pas de notification que l'application va être arrêtée.

Activation de styles visuels

Les styles visuels Microsoft Windows XP sur un contrôle Windows Forms ne sont peut-être pas activés. La méthode Application.EnableVisualStyles est appelée dans le modèle pour une application Windows Forms. Même si cette méthode n'est pas appelée par défaut, si vous utilisez Visual Studio pour créer un projet, vous obtiendrez les styles visuels Microsoft Windows XP pour les contrôles, si la version 6.0 de Comctl32.dll est disponible. Vous devez appeler la méthode EnableVisualStyles avant que les handles ne soient créés sur le thread. Pour plus d'informations, consultez Comment : activer des styles visuels dans une application hybride.

Contrôles sous licence

Les contrôles Windows Forms sous licence qui affichent un message avec les informations relatives à la licence peuvent provoquer un comportement inattendu pour une application hybride. Certains de ces contrôles affichent une boîte de dialogue en réponse à la création du handle. Par exemple, un contrôle sous licence peut informer l'utilisateur qu'une licence est requise ou qu'il dispose encore de trois essais pour le contrôle.

L'élément WindowsFormsHost dérive de la classe HwndHost et le handle du contrôle enfant est créé dans la méthode BuildWindowCore. La classe HwndHost ne permet pas de traiter les messages dans la méthode BuildWindowCore, mais l'affichage d'une boîte de dialogue peut déclencher l'envoi des messages. Pour activer ce scénario d'attribution de licences, appelez la méthode Control.CreateControl sur le contrôle avant de l'assigner comme enfant de l'élément WindowsFormsHost.

Concepteur WPF

Vous pouvez concevoir votre contenu WPF à l'aide du Concepteur Windows Presentation Foundation (WPF) pour Visual Studio. Les sections suivantes décrivent quelques problèmes courants qui peuvent se produire lors de la création d'applications hybrides avec le Concepteur WPF.

BackColorTransparent est ignoré au moment du design.

Il est possible que la propriété BackColorTransparent ne fonctionne pas comme prévu au moment du design.

Si un contrôle WPF n'est pas sur un parent visible, l'exécution de WPF ignore la valeur BackColorTransparent. BackColorTransparent peut notamment être ignoré si l'objet ElementHost est créé dans un AppDomain distinct. Par contre, lorsque vous lancez l'application, BackColorTransparent fonctionne normalement.

La liste d'erreurs au moment du design apparaît lorsque le dossier obj est supprimé.

Si le dossier obj est supprimé, la liste d'erreurs au moment du design apparaît.

En cas de design à l'aide de ElementHost, le Concepteur Windows Forms utilise des fichiers générés dans le dossier Debug ou Release situé dans le dossier obj de votre projet. Si vous supprimez ces fichiers, le système affiche la liste d'erreurs au moment du design. Pour résoudre ce problème, recréez votre projet. Pour plus d'informations, consultez Erreurs au moment du design dans le Concepteur Windows Forms.

ElementHost et IME

Les contrôles WPF hébergés dans un ElementHost ne prennent actuellement pas en charge la propriété ImeMode. Toute modification apportée à ImeMode sera ignorée par les contrôles hébergés.

Voir aussi

Tâches

Comment : activer des styles visuels dans une application hybride

Concepts

Architecture d'entrée pour l'interopérabilité entre Windows Forms et WPF

Considérations sur la disposition de l'élément WindowsFormsHost

Mappage de propriétés Windows Forms et WPF

Erreurs au moment du design dans le Concepteur Windows Forms

Référence

ElementHost

WindowsFormsHost

Autres ressources

Interopérabilité avec le concepteur WPF

Migration et interopérabilité