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?
Répondre
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'?
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 –
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.
On répond ici: http://stackoverflow.com/a/821609/58768 –