Comment capturer un clic de souris sur un élément D'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. J'ai essayé MouseLeftButtonDownEvent - comme il ne semble pas être un MouseClick événement, mais il n'est pas appelé.

question secondaire un peu plus générale: Comment puis-je voir quels événements existent et quels gestionnaires leur correspondent et quand ils font réellement quelque chose? Par exemple, ce qui me dit que pour MouseDoubleClickEvent j'ai besoin d'un <!--5? Peut-être pour un MouseLeftButtonDownEvent j'ai besoin d'un autre handler et c'est pour ça que ça ne marche pas?

j'ai aussi essayé sous-classement ListBoxItem et remplacer OnMouseLeftButtonDown - mais il n'est pas appelée.

Marc

31
demandé sur Jeff 2009-08-13 15:22:33

6 réponses

je crois que votre MouseLeftButtonDown gestionnaire n'est pas appelé parce que le ListBox utilise cet événement à l'interne pour tirer son SelectionChanged est tout ce dont vous avez besoin). Cela dit, vous avez quelques options.

d'Abord, vous pouvez vous abonner à l' 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 l'obtient en premier, et il n'a pas géré l'événement il remonte l'arbre visuel en donnant à chaque contrôle une chance de gérer l'événement. Les événements de prévisualisation, d'autre part, creusent un tunnel. Cela signifie qu'ils commencent à la racine de l'arborescence visuelle (généralement Window), et se frayent un chemin jusqu'au contrôle qui a généré l'événement. Depuis votre code aurait la chance de gérer l'événement avant l' ListBoxItem, cela va être viré (et ne pas être manipulé) donc votre gestionnaire d'événements sera appelé. Vous pouvez implémenter cette option en remplaçant MouseDoubleClickEvent dans votre exemple avec PreviewMouseLeftButtonDown.

l'autre option est d'enregistrer un gestionnaire de classe qui sera notifié chaque fois qu'un ListBoxItem les feux de l' MouseLeftButtonDown événement. C'est fait comme ceci:

EventManager.RegisterClassHandler(typeof(ListBoxItem),
    ListBoxItem.MouseLeftButtonDownEvent,
    new RoutedEventHandler(this.MouseLeftButtonDownClassHandler));

private void OnMouseLeftButtonDown(object sender, RoutedEventArgs e)
{
}

les gestionnaires de classe sont appelés avant tout autre gestionnaire 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, alors à chaque fois que tout ListBoxItem 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 à 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 que événement.

47
répondu Andy 2009-08-13 12:19:30

je pense que la première réponse D'Andy d'utiliser PreviewMouseLeftButtonDown est la façon de procéder. En XAML, il devrait ressembler à ceci:

<ListBox Name="testListBox">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBox_MouseLeftButtonDown" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
16
répondu RandomEngy 2009-08-13 16:26:23

Il y a aussi une autre façon de gérer PreviewMouseDown événement et de vérifier si elle a été déclenchée par l'élément de liste:

In XAML:

<ListBox PreviewMouseDown="PlaceholdersListBox_OnPreviewMouseDown"/> 

dans le codebehind:

private void PlaceholdersListBox_OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    var item = ItemsControl.ContainerFromElement(sender as ListBox, e.OriginalSource as DependencyObject) as ListBoxItem;
    if (item != null)
    {
        // ListBox item clicked - do some cool things here
    }
}

a Été inspiré par réponse, mais il utilise listbox par son nom, je propose d'utiliser l'argument sender pour éviter les dépendances inutiles.

13
répondu Pavel K 2017-05-23 12:09:36

il y a une autre façon d'obtenir L'événement MouseDown dans ListBox. Vous pouvez ajouter event handler pour les événements qui sont marqués comme manipulés en utilisant handledEventsToo signature de AddHandler méthode:

myListBox.AddHandler(UIElement.MouseDownEvent, 
        new MouseButtonEventHandler(ListBox_MouseDown), true);

Troisième paramètre ci-dessus est handledEventsToo ce qui garantit que ce gestionnaire sera invoqué, peu importe si c'est déjà marqué comme Handled (ListBoxItem dans la zone de liste).

Voir marquage des événements routés tels Qu'ils sont traités, et gestion des classes pour explication.

Voir Comment Attacher à l'Événement MouseDown sur ListBox par exemple.

9
répondu zendar 2010-07-25 14:49:36

vous pouvez utiliser L'argument SelectionChangedEventArgs de L'événement SelectionChanged pour trouver quel élément est ajouté ou supprimé par AddedItems et RemovedItems, généralement seulement avoir la dernière cliqué dessus, ou si non, alors regardez le dernier élément qui est le count-1.

0
répondu amirhp 2015-06-22 14:06:03

Vous pouvez utiliser Event="MouseLeftButtonUp"

Contrairement à "PreviewLeftButtonDown" il va obtenir le ListBoxItem manipulé aussi.

0
répondu elig 2018-03-17 23:18:28