2010-05-11 6 views
3

Je possède ce problème dans un plus grand projet ...... donc je mis en place un 'Testpoject' comme preuve du concept:Silverlight Listbox tir MouseRightButtonDown, mais pas MouseLeftButtonDown

  • New Silverlight-application
  • Ajouter Listbox
  • Remplissez listbox avec quelques cases à cocher
  • Inscrivez-listBox1_MouseLeftButtonDown
  • registre listBox1_MouseRightButtonDown

Vous verrez, que le listBox1_MouseLeftButtonDown ne tirera en aucun cas .... listBox1_MouseRightButtonDown cependant se déclenche juste bien.

J'ai essayé d'utiliser une classe personnalisée dérivée de ListBox et de redéfinir, en supposant que quelque chose dans la classe ListBox définissait e.Handled = false, mais cela n'a pas non plus changé le comportement.

Toutes les idées sur pourquoi cela se produit et comment y remédier?

(Ce problème s'arrête aussi le « parent' contrôle de réception de l'événement Click-... si l'événement-passage est cassé)

: modifier: Je fixe mon problème avec une solution de contournement ... donc une réponse n'est plus nécessaire. Juste si quelqu'un a envie de comprendre pourquoi cela se passe pour le plaisir;)

+0

Vous devez envoyer votre solution de contournement comme une réponse pour d'autres personnes – Stephan

+0

La solution était particulière pour ma situation ... Je n'utilise une autre façon de faire ce que je voulais faire. Ce n'est pas une solution de contournement générale pour ce problème. – Steav

Répondre

5

This semble répondre à votre question. Pour citer:

C'est parce que ListBoxItem gère en interne cet événement ainsi que l'événement MouseLeftButtonDown (arrêt de la formation de bulles) pour mettre en œuvre la sélection d'éléments.

La solution consiste à ajouter le gestionnaire d'événements dans le fichier code-behind. De l'article:

Bien définissant la propriété Handled de paramètre RoutedEventArgs à true dans un gestionnaire d'événement routé semble arrêter le tunnel ou le barbotage, les gestionnaires individuels plus haut ou vers le bas l'arbre peut choisir de recevoir les événements de toute façon! Cela peut uniquement être effectué à partir du code de procédure, en utilisant une surcharge de AddHandler qui ajoute un paramètre Boolean processedEventsToo.

Voir la mise en garde à la fin si.

1

Ceci est voulu. Si vous vérifiez le code de structure, vous verrez que ListBoxItem définit la propriété Handled sur true.

J'ai eu le même problème exact, donc dans mon ListBoxItem.ItemTemplate, j'ai ajouté le gestionnaire d'événements dans mon contenu.

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal" MouseLeftButtonDown="StackPanel_MouseLeftButtonDown"> 
     ... other controls ... 
     </StackPanel> 
    </DataTemplate> 
</ListBox.ItemTemplate>