2009-07-27 17 views
6

J'héberge le contrôle windowsforms dans WPF popup. Problèmes ci-dessous:WPF Popup et WindowsFormsHost Problème

  1. Si je StaysOpen = False je ne peux pas interagir avec le contrôle Winform. StaysOpen à false est nécessaire car lorsque vous cliquez sur la région Popup, elle doit fermer.
  2. si je fais StaysOpen = True je peux interagir avec le contrôle winform mais quand je clique en dehors de la zone de popup, il ne se ferme pas.
  3. J'ai essayé de définir StaysOpen = true dans MouseEnter de popup et StaysOpen = False dans MouseLeave, mais MouseLeave se déclenche au fur et à mesure que la souris est au-dessus du contrôle de winform résultant en un comportement inattendu.
  4. J'ai même essayé la propriété IsMouseCaptureWithin de popup et j'ai trouvé qu'elle ne fonctionnait pas avec winforms (je suppose que c'est un bug dans framework). Un autre problème, j'essayais de fermer le popup lorsque le formulaire principal root (qui est sous forme de windows) est désactivé (pressé Alt + Tab), mais cet évènement (désactiver) est déclenché même quand j'entre dans l'un des contrôles dans windowshostControl dans le popup.

Comportement souhaité:

  1. devrait être en mesure d'accueillir et d'interagir avec le contrôle Winform dans WPF pop-up.
  2. en cliquant sur en dehors de la zone de popup, popup devrait fermer.

Appréciez toutes les entrées.

Merci.

Répondre

2

J'ai eu beaucoup de problèmes avec les popups standards de WPF, car ils sont en fait une nouvelle fenêtre avec leur propre handle. Cela signifie que si vous faites glisser votre application autour de l'écran, la fenêtre reste en place (elle ne bouge pas avec votre fenêtre). Cela signifie également que votre popup a des comportements étranges et n'interagit pas avec votre application de la même manière que les autres contrôles.

J'ai créé 2 classes de décorateur pour résoudre ce problème:

PopupDecorator.cs et TimeoutPopupDecorator.cs

Il est assez simple à utiliser:

  1. Ajouter une déclaration d'espace de noms pour les nouvelles classes de pop-up . à savoir

    xmlns: dday_wpf = "clr-namespace: DDay.WPF"

  2. Surround la zone que vous voulez le menu contextuel pour pouvoir afficher avec le décorateur. à savoir

    < dday_wpf: PopupDecorator x: Name = "pop-up"> < dday_wpf: PopupDecorator.Popup> ... contenu de pop-up vont ici ... < /dday_wpf:PopupDecorator.Popup> ... le contenu du panneau va ici ... </dday_wpf: PopupDecorator>

Il fonctionne à peu près identique à un Popup normal à partir de ce moment.

Cela peut ne pas résoudre tous vos problèmes, mais j'espère que cela aide.

+0

Pouvez-vous nous donner quelques liens mis à jour? –

+0

Pas de problème, j'ai mis à jour les liens pour pointer vers l'emplacement correct maintenant. – Doug

0

Cela ressemble un peu à mon problème lors du lancement d'un contrôle winform non modal à partir d'un formulaire WPF.

Consultez ma question Why is my WPF textbox "kinda" readonly?. Le juste être, basé sur ce que Doug a dit à propos des popups étant une fenêtre avec son propre handle, rend cela applicable.