2009-08-25 5 views
2

je le code XAML suivant:de ne pas de contrôle WPF Checkbox réagissent à l'événement MouseLeftButtonDown

<Grid Background="Blue"> 
     <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown"> 
      <CheckBox MouseLeftButtonDown="CheckBox_MouseLeftButtonDown_1"></CheckBox> 
     </Grid> 
</Grid> 

Lorsque je clique sur la case avec le bouton gauche de la souris, l'événement a déclaré ne se déclenche pas. Quelqu'un peut-il avoir une explication pour ce comportement? Merci d'avance

Répondre

5

L'événement est géré par autre chose (probablement consommé par l'événement Checked).

Si vous modifiez l'événement à PreviewMouseLeftButtonDown (la version de tunnel de MouseLeftButtonDown), il se déclenchera correctement.

2

CheckBox hérite de ButtonBase, qui ajoute un gestionnaire de classe pour l'événement de bouton gauche bas (OnMouseLeftButtonDown). Comme la documentation pour l'événement UIElement.MouseLeftButtonDown mentionne (Souligné par l'auteur):

Certaines classes de contrôle pourraient avoir la gestion de classe inhérente pour les événements de la souris bouton . Le bouton gauche de la souris vers le bas est l'événement le plus probable pour gérer un cours dans un contrôle. La gestion de classe marque souvent l'événement de classe sous-jacente géré comme géré. Une fois que l'événement est marqué , les autres gestionnaires d'instance qui sont attachés à cet élément ne sont pas normalement . Toute autre classe ou gestionnaires d'instance qui sont attachés à éléments dans la direction de bullage vers la racine dans l'arborescence de l'interface utilisateur sont également pas généralement soulevées.

Vous pouvez jouer avec le ClickMode et le définir sur ClickMode.Hover, ce qui semble empêcher le comportement que vous voyez. Toutefois, vous devrez peut-être maintenir une logique personnalisée dans votre gestionnaire d'événements pour cette instance particulière pour définir l'état de basculement approprié de votre case à cocher.

Vous pouvez également essayer l'événement PreviewMouseLeftButtonDown. Cependant, marquer cet événement comme manipulé dans votre gestionnaire peut avoir des effets secondaires sur le reste des événements MouseDown - ils porteront les informations manipulées, ce qui empêchera d'autres gestionnaires d'instance à moins qu'ils ne soient ajoutés avec AddHandler avec l'indicateur pour gérer les événements déjà gérés.

+0

Prenez mon idée sans mettre à votation ma réponse? Brutal là, Franci. – Charlie

+0

Lol, @Charlie, vous ne possédez pas l'événement PreviewMouseLeftButtonDown. C'est un événement public. :-) Mais vous l'avez mentionné avant moi, alors je vous ai donné votre upvote (malheureusement, vous ne pouvez en obtenir qu'une de moi, cependant). –

+0

Haha c'est correct et ce n'est pas grave. Mais vous avez édité votre message pour l'inclure après avoir lu le mien. :) – Charlie

0

Franci merci pour votre réponse ... Je dois cocher MouseLeftDownEvent à feu, et la définition de clickMode = hover a résolu mon problème. J'ai besoin de MouseleftDownEvent pour lancer l'événement sur la grille parente.

Questions connexes