2008-10-02 4 views
14

J'ai essayé XAML:WPF: curseur ne marche pas lever MouseLeftButtonDown ou MouseLeftButtonUp

<Slider Width="250" Height="25" Minimum="0" Maximum="1" MouseLeftButtonDown="slider_MouseLeftButtonDown" MouseLeftButtonUp="slider_MouseLeftButtonUp" /> 

Et ce C#:

private void slider_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
sliderMouseDown = true; 
} 

private void slider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
sliderMouseDown = false; 
} 

La variable sliderMouseDown ne change jamais parce que les événements MouseLeftButtonDown et MouseLeftButtonUp ne sont jamais élevés. Comment puis-je obtenir ce code pour fonctionner quand un utilisateur a le bouton gauche de la souris sur un curseur pour avoir une valeur booléenne définie sur true, et quand la souris est en haut, le booléen est défini sur false?

Répondre

14

Les curseurs englobent les événements MouseDown (similaire au bouton).

Vous pouvez vous inscrire aux événements PreviewMouseDown et PreviewMouseUp qui sont déclenchés avant que le curseur ait la possibilité de les gérer.

+0

Merci, j'ai pu utiliser l'événement IsMouseCapturedWithinChanged en combinaison avec les événements PreviewMouseLeftButtonUp pour atteindre mon objectif ultime. – Nick

+0

Est-ce que quelqu'un connaît la raison de ce comportement? – PeterAllenWebb

+0

La raison de ce comportement est que le bouton gère l'événement MouseDown. Par défaut, si un contrôle indique qu'il a géré un événement, personne d'autre ne reçoit de notification à moins d'avoir spécifié qu'il souhaite également voir les événements gérés. –

16

Une autre façon de le faire (et peut-être mieux en fonction de votre scénario) est d'enregistrer un gestionnaire d'événements dans le code de procédure comme suit:

this.AddHandler 
(
    Slider.MouseLeftButtonDownEvent, 
    new MouseButtonEventHandler(slider_MouseLeftButtonDown), 
    true 
); 

S'il vous plaît noter le véritable argument. Il dit essentiellement que vous voulez recevoir cet événement même s'il a été marqué comme manipulé. Malheureusement, l'accrochage d'un gestionnaire d'événements comme celui-ci ne peut se faire que par du code procédural et non par xaml. En d'autres termes, avec cette méthode, vous pouvez enregistrer un gestionnaire d'événements pour l'événement normal (qui bulle) au lieu de l'événement d'aperçu qui tunnels (et se produisent donc à des moments différents).

Voir la barre latérale Digging Deeper à la page 70 de WPF Unleashed pour plus d'informations.

+1

Utiliser cette astuce semble être le genre de piratage qui pourrait rendre votre travail (ou celui de quelqu'un d'autre) beaucoup plus difficile à l'avenir. Est-ce vraiment une bonne idée? – PeterAllenWebb

+0

Je ne dirais pas que c'est un hack. Cependant, cela étant dit, j'essaierais d'éviter de l'utiliser si possible, mais si vous êtes entre le rock et un endroit difficile ... Laissez-moi vous expliquer. Les événements de prévisualisation tirent avant les événements réguliers. Ainsi, l'utilisation des événements de prévisualisation peut ne pas toujours fonctionner dans la situation actuelle. – cplotts

+0

C'est le "seul" moyen de faire fonctionner Wpf dans notre application MFC. Les événements de prévisualisation jouent avec notre messagerie au sein de l'application. –

1

Je voudrais mentionner que le Slider n'avale pas tout l'événement MouseDown. En cliquant sur une coche, peut être averti pour l'événement. Le curseur ne gérera pas les événements MouseDown, sauf s'ils proviennent du curseur du curseur.

Fondamentalement, si vous décidez d'utiliser le

AddHandler(Slider.MouseLeftButtonDownEvent, ..., true) 
la version

avec les tiques sous tension, assurez-vous que l'événement a été traité précédemment. Si vous ne le faites pas vous finirez avec un cas de bord où vous pensiez que le curseur a été cliqué, mais c'était vraiment une coche. L'inscription à l'événement de prévisualisation est encore pire - vous pourrez récupérer l'événement n'importe où, même sur l'espace blanc entre les ticks.

4

Essayez d'utiliser LostMouseCapture et GotMouseCapture.

private void sliderr_LostMouseCapture(object sender, MouseEventArgs e) 

    private void slider_GotMouseCapture(object sender, MouseEventArgs e) 

feux de GotMouseCapture lorsque l'utilisateur commence glisser le curseur, et LostMouseCapture quand il libère.

Questions connexes