2010-10-13 19 views
1

J'ai fait un contrôle en XAML et l'ai ajouté à la couche d'ornement, dans le contrôle j'ai une section qui devrait engendrer un menu contextuel lorsque vous cliquez avec le bouton droit (à l'aide de la propriété TextBox.ContextMenu). Je l'ai testé dans une fenêtre régulière de WPF et ça marche très bien. Cependant, quand j'ai essayé la même chose dans Visual Studio sur une couche d'ornement, j'ai seulement obtenu le menu contextuel de l'éditeur VS2010.Faites un clic droit sur le menu contextuel pour orner - Ne fonctionne pas et appelle le menu de l'éditeur à la place (VS2010)

J'ai également essayé maintenant d'utiliser un événement MouseRightButtonUp régulier, qui semble fonctionner (l'événement arrive à la fonction). Cependant, dès que la fonction d'événement se termine, le menu contextuel de l'éditeur est activé.

  1. Comment faire pour que le menu contextuel fonctionne?
  2. S'il n'y a aucun aucun moyen, comment puis-je empêcher le menu contextuel de l'éditeur de sauter après fonction MouseRightButtonUp?
  3. (Suivi à # 2) Comment appeler le menu contextuel manuellement à partir de MouseRightButtonUp?

Merci, Vitaly

Répondre

2

Dans votre bouton jusqu'à gestionnaire, vous marquez l'événement traité? Sinon, l'éditeur verra l'événement après la fin de votre gestionnaire. Si vous le marquez comme manipulé et qu'il ne fonctionne toujours pas, il y a une autre option.

La façon la plus «officielle» de le faire est de mettre en œuvre un IMouseProcessorProvider + MouseProcessorBase. Vous devrez remplacer PreprocessMouseRightButtonUp, mais uniquement lorsque votre élément est l'élément sur lequel vous avez cliqué. C'est ainsi que fonctionne le code du menu contextuel de l'éditeur normal; Il implémente l'un de ces processeurs de souris, gère les clics droits et demande au shell Visual Studio d'afficher un menu contextuel à l'emplacement du clic (en envoyant la commande SHOWCONTEXTMENU).

Si vous allez dans cette voie, votre fournisseur de traitement de la souris devrait avoir cette méta-données (tapée à la main, désolé pour fautes de frappe):

[Export(typeof(IMouseProcessorProvider))] 
[Name("WhateverYouWantToCallIt")] 
[Order(Before = "VisualStudioMouseProcessor")] 
[ContentType("text")] // or whatever your adornment is specific to 
[TextViewRole(PredefinedTextViewRoles.Interactive)] 
internal sealed class MouseProcProvider : IMouseProcessorProvider 
+0

Salut Noah. Merci pour la réponse. En effet, j'avais juste besoin de marquer l'événement comme manipulé pour le faire fonctionner. J'éviterai la façon «officielle» pour le moment, à moins que je rencontre des problèmes avec la manière la plus simple, mais je vais garder ça à l'esprit. Merci encore! – VitalyB