2010-11-11 51 views
3

Y at-il un moyen que je peux mettre en œuvre Click sur un ListBoxItem? Il y a MouseLeftButtonUp mais son pas vraiment la même chose, je peux la souris ailleurs et glisser dans une autre ListBoxItem et il fonctionne encore, problème mineur tho, il peut-être bizarre pour les utilisateurs thoComment puis-je avoir un événement Click sur ListBoxItem?

+0

On répond ici: http://stackoverflow.com/a/821609/58768 –

Répondre

2

Vous pourriez faire une nouvelle ControlTemplate pour la ListBoxItem avec quelque chose cliquable en tant qu'élément-racine (comme un bouton), gérer l'événement click sur celui-ci et placer le ContentPresenter dans le 'cliquable'?

+0

Je suppose que c'est 1 solution, j'attendrai juste pour voir s'il y a d'autres solutions, sinon cela sera marqué comme réponse –

3

J'ai supprimé cette réponse parce que je me suis rendu compte que c'était beaucoup pour cette tâche simple, mais j'ai pensé que je la publierais quand quelqu'un voudrait savoir comment sous-classer ListBoxItem pour une raison quelconque.

Pour vraiment obtenir un événement Click à partir d'un ListBoxItem, vous devrez procéder comme suit. Première sous-classe ListBoxItem et vérifiez MouseEnter, MouseLeave, MouseUp, MouseDown pour savoir quand le déclencher.

public class ClickableListBoxItem : ListBoxItem 
{ 
    // Register the routed event 
    public static readonly RoutedEvent ClickEvent = 
     EventManager.RegisterRoutedEvent("Click", RoutingStrategy.Bubble, 
     typeof(RoutedEventHandler), typeof(ClickableListBoxItem)); 

    // .NET wrapper 
    public event RoutedEventHandler Click 
    { 
     add 
     { 
      AddHandler(ClickEvent, value); 
     } 
     remove 
     { 
      RemoveHandler(ClickEvent, value); 
     } 
    } 

    protected void OnClick() 
    { 
     RaiseEvent(new RoutedEventArgs(ClickEvent)); 
    } 

    private bool m_isClickable = false; 
    private bool m_click = false; 
    protected override void OnMouseEnter(System.Windows.Input.MouseEventArgs e) 
    { 
     m_isClickable = true; 
     base.OnMouseEnter(e); 
    } 
    protected override void OnMouseLeave(System.Windows.Input.MouseEventArgs e) 
    { 
     m_isClickable = false; 
     base.OnMouseLeave(e); 
    } 
    protected override void OnPreviewMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs e) 
    { 
     if (m_click == true) 
     { 
      OnClick(); 
     } 
     base.OnPreviewMouseLeftButtonUp(e); 
    } 
    protected override void OnPreviewMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e) 
    { 
     if (m_isClickable == true) 
     { 
      m_click = true; 
     } 
     base.OnPreviewMouseLeftButtonDown(e); 
    } 
} 

Pour obtenir le ListBox à utiliser ClickableListBoxItem au lieu de ListBoxItem nous devons également ListBox sous-classe et passer outre GetContainerForItemOverride. Ensuite, nous pouvons utiliser cette ClickableListBox dans Xaml et obtenir l'événement Click comme ceci. Nous pouvons ensuite utiliser ClickableListBox dans Xaml. Cela ne fonctionnera pas Mather ce que vous mettez dans le ItemTemplate, boutons, zones de texte, TextBlocks etc.

<local:ClickableListBox x:Name="c_listBox"> 
    <local:ClickableListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type local:ClickableListBoxItem}"> 
      <EventSetter Event="Click" Handler="ListBoxItem_Click"/> 
     </Style> 
    </local:ClickableListBox.ItemContainerStyle> 
</local:ClickableListBox> 

Une solution plus simple serait de sous-classe juste le conteneur parent dans le ItemTemplate pour le ListBoxItem et utiliser les mêmes routines souris.