Comment faire pour capturer un clic de souris sur un Élément dans une liste dans WPF?
Je veux être averti lorsqu'un élément d'une liste obtient clique sur la souris, si elle est déjà sélectionnée ou pas.
J'ai cherché et trouvé ceci: (http://kevin-berridge.blogspot.com/2008/06/wpf-listboxitem-double-click.html voir les commentaires)
private void AddDoubleClickEventStyle(ListBox listBox, MouseButtonEventHandler mouseButtonEventHandler)
{
if (listBox.ItemContainerStyle == null)
listBox.ItemContainerStyle = new Style(typeof(ListBoxItem));
listBox.ItemContainerStyle.Setters.Add(new EventSetter()
{
Event = MouseDoubleClickEvent,
Handler = mouseButtonEventHandler
});
}
//Usage:
AddDoubleClickEventStyle(listView1, new MouseButtonEventHandler(listView1_MouseDoubleClick));
Cela fonctionne, mais il le fait pour un DoubleClick
. Je ne peux pas obtenir un seul clic si. J'ai essayé MouseLeftButtonDownEvent
- comme il ne semble pas être un MouseClick
événement, mais il n'est pas appelé.
Un peu plus général de côté la question: Comment puis-je voir ce qui n'existe pas et les gestionnaires correspondent à eux et quand ils font vraiment quelque chose? Par exemple, ce qui me dit que pour MouseDoubleClickEvent
j'ai besoin d'un MouseButtonEventHandler
? Peut-être pour un MouseLeftButtonDownEvent
j'ai besoin de quelques autres gestionnaires et c'est pourquoi il ne fonctionne pas?
J'ai aussi essayé sous-classement ListBoxItem
et remplacer OnMouseLeftButtonDown
- mais il n'est pas appelé.
Marc
- J'ai choisi de vous envelopper chaque listboxitem avec bouton et utilisez la touche de l'événement à la place. stackoverflow.com/questions/17057022/...
Vous devez vous connecter pour publier un commentaire.
Je crois que votre
MouseLeftButtonDown
gestionnaire n'est pas appelé parce que leListBox
utilise cet événement en interne pour feu sonSelectionChanged
événement (avec la pensée que, dans la grande majorité des cas,SelectionChanged
est tout ce dont vous avez besoin). Cela dit, vous avez quelques options.D'abord, vous pouvez vous abonner à la
PreviewLeftButtonDown
événement à la place. La plupart des événements routés ont une stratégie de routage de bulles, ce qui signifie que le contrôle qui a généré l'événement est d'abord, et il n'est pas manipulé l'événement fait son chemin jusqu'à l'arbre visuel donnant à chaque contrôle une chance à la gestion de l'événement. L'Aperçu des événements, d'autre part, sont Tunneling. Cela signifie qu'ils commencent à la racine de l'arborescence visuelle (généralementWindow
), et de travailler leur chemin vers le contrôle qui a généré l'événement. Depuis votre code aurait la chance de gérer l'événement avant laListBoxItem
, cela va me faire virer (et ne pas être traitées) afin que votre gestionnaire d'événements va être appelé. Vous pouvez mettre en œuvre cette option en remplacement deMouseDoubleClickEvent
dans votre échantillon avecPreviewMouseLeftButtonDown
.L'autre option est de s'inscrire à une classe de gestionnaire qui sera notifié à chaque fois qu'un
ListBoxItem
les feux de laMouseLeftButtonDown
événement. C'est fait comme ceci:De catégorie Gestionnaires sont appelés avant les autres gestionnaires d'événements, mais ils sont appelés pour tous les contrôles du type spécifié dans l'ensemble de votre application. Donc, si vous avez deux
ListBoxes
, puis à chaque fois queListBoxItem
est cliqué dans l'un ou l'autre, ce gestionnaire d'événement sera appelé.Quant à votre deuxième question, la meilleure façon de savoir quel type de gestionnaire d'événements dont vous avez besoin pour un événement donné, et pour voir la liste des événements disponibles pour un contrôle donné, est d'utiliser la documentation MSDN. Par exemple, la liste de tous les événements gérés par
ListBoxItem
est à http://msdn.microsoft.com/en-us/library/system.windows.controls.listboxitem_events.aspx. Si vous cliquez sur le lien pour un événement, il comprend le type de gestionnaire d'événement pour l'événement.Je pense que Andy est d'abord la réponse de à l'aide de PreviewMouseLeftButtonDown est la voie à suivre à ce sujet. En XAML, il devrait ressembler à ceci:
Il y a aussi une autre façon de gérer
PreviewMouseDown
de l'événement et de vérifier si elle a été déclenchée par l'élément de liste:En XAML:
Dans le code-behind:
A été inspiré par cette réponse, mais il utilise la zone de liste par nom, je propose d'utiliser l'expéditeur argument pour éviter les dépendances.
ListBoxItem
qui a été cliqué?Il y a une autre façon d'obtenir de l'événement MouseDown dans la zone de liste. Vous pouvez ajouter un gestionnaire d'événements pour les événements qui sont marqués comme étant géré à l'aide de
handledEventsToo
signature deAddHandler
méthode:Troisième paramètre ci-dessus est
handledEventsToo
qui assure que ce gestionnaire sera invoqué, peu importe si c'est déjà marqué commeHandled
(quiListBoxItem
dans ListBox).Voir Marquage des Événements Routés comme traité, et la gestion de Classe pour les explications.
Voir Comment faire pour Joindre à l'Événement MouseDown sur la zone de liste par exemple.
Vous pouvez utiliser le SelectionChangedEventArgs argument de l'événement SelectionChanged pour trouver ce point est d'ajouter ou retirés par AddedItems et RemovedItems, habituellement seulement d'avoir la dernière cliqué sur, ou si non, puis de regarder le dernier élément qui est le count-1.
Vous pouvez utiliser
Event="MouseLeftButtonUp"
Contrairement à
"PreviewLeftButtonDown"
il obtiendra le ListBoxItem manipulé.