2009-12-07 3 views
0

j'ai été battre la tête contre un problème de Popup WPF, et espère que quelqu'un peut me aider :) Le contour se présente comme suit:popups dans WPF perdent immédiatement et se concentrer près

Notre application stocke une liste de UIObjects - ceux-ci représentent des éléments qui sont affichés dans une fenêtre 3D (via un membre UIRenderObject, qui est juste un maillage carré et carré avec un bitmap) et dans une vue arborescente (via un membre TreeViewItem). Dans les deux cas, lorsque l'objet détecte un clic droit, il essaie d'ouvrir une fenêtre contextuelle. Le code qui est sur aussi simple que vous pouvez obtenir:

ContextMenu contextMenu = new ContextMenu(); 

//add content 

contextMenu.IsOpen = true; 

Lorsque je clique dans la fenêtre, tout fonctionne comme prévu - le menu contextuel ouvre, et reste ouvert jusqu'à ce qu'il perd le focus ou une sélection est faite . Dans l'arborescence, le popup perd son focus et se ferme immédiatement. J'ai essayé de définir explicitement le focus, en définissant explicitement le PlacementTarget, en marquant l'événement de la souris comme manipulé avant et après l'appel pour ouvrir le popup, en marquant le popup comme "StaysOpen" et une douzaine d'autres choses, et encore il se ferme immédiatement.

Toute aide sera grandement appréciée. Merci d'avance!

+0

Y at-il des événements TreeView ou TreeView cliquez sur les événements liés aux gestionnaires, et si oui, que font ces gestionnaires? –

+0

Il existe des gestionnaires de clics pour la gauche, la droite et le milieu sur le TreeViewItem - ils transmettent chacun à l'UIObject pour faire leur propre chose, puis appellent le gestionnaire de base UIElement pour le bouton de la souris approprié. Donc, 'base.OnMouseRightButtonDown' dans le cas de mes Popups. Dans le gestionnaire RightClick de UIObject, tout ce qui se passe est l'appel à ShowContextMenu, qui remplit et ouvre la fenêtre contextuelle. Le clic gauche sélectionne simplement l'élément Vue arborescente. Le clic du milieu ne fait rien du tout. J'ai essayé de supprimer l'appel à base.OnMouseRightButtonDown et de simplement marquer l'événement comme étant géré, mais en vain. – b34r

Répondre

0

Soupir, car il s'avère que je compliquais trop la question. Plutôt que de gérer moi-même le menu contextuel, il suffisait de l'assigner au propre ContextMenu de TreeViewItem et de laisser le système s'en occuper. Ça va m'apprendre. Merci pour l'entrée de tout le monde :)

+0

Silly réponse cela ne fonctionne pas du tout – user1034912

-1

C'est le comportement par défaut de ContextMenu. Vous pouvez également utiliser Popup Class au lieu de ContextMenu. Ensuite, vous pouvez l'étendre en tant que votre condition.

+0

Vraiment? Cela me semble très étrange. Ce serait une chose si c'était cohérent. Mais pour le moment, il fonctionne comme prévu dans un cas, et se ferme immédiatement lorsqu'il est ouvert par la même méthode à partir d'une source légèrement différente. Je vais voir ce que je peux faire avec la classe Popup, cependant. Merci! – b34r

Questions connexes