Question

J'ai essayé ce XAML:

<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 car les événements MouseLeftButtonDown et MouseLeftButtonUp ne sont jamais déclenchés. Comment puis-je faire fonctionner ce code lorsqu'un utilisateur a le bouton gauche de la souris enfoncé sur un curseur pour que sa valeur booléenne soit définie sur true et que, lorsque la souris est en haut, la valeur booléenne est définie sur false?

Était-ce utile?

La solution

Les curseurs avalent les événements MouseDown (similaires au bouton).

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

Autres conseils

Une autre façon de le faire (et éventuellement mieux en fonction de votre scénario) consiste à enregistrer un gestionnaire d'événements dans un code de procédure similaire à celui-ci:

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

Veuillez noter le véritable argument. Elle indique en gros que vous souhaitez recevoir cet événement même s'il a été marqué comme géré. Malheureusement, connecter un gestionnaire d'événements de ce type ne peut s'effectuer qu'à partir du code de procédure et non de xaml.

En d’autres termes, avec cette méthode, vous pouvez enregistrer un gestionnaire d’événements pour l’événement normal (quelles bulles) au lieu de l’événement de prévisualisation des tunnels (et donc à des moments différents).

Reportez-vous à la barre latérale Creuser plus profondément à la page 70 de WPF Unleashed pour plus d'informations.

Essayez d’utiliser LostMouseCapture et GotMouseCapture.

    private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)

    private void slider_GotMouseCapture(object sender, MouseEventArgs e)

GotMouseCapture se déclenche lorsque l'utilisateur commence à faire glisser le curseur et LostMouseCapture lorsqu'il le relâche.

Je voudrais mentionner que le Slider n’avale pas tout l’événement MouseDown. En cliquant sur une coche, vous pouvez être averti de l'événement. Le curseur ne gérera pas les événements MouseDown à moins qu'ils ne proviennent du ... curseur du curseur.

Fondamentalement, si vous décidez d'utiliser le

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

version cochée, assurez-vous que l'événement a déjà été traité. Si vous ne le faites pas, vous vous retrouverez avec un cas extrême où vous pensiez que le curseur était cliqué, mais c'était vraiment une tique. L’inscription à l’événement de prévisualisation est encore pire: vous pourrez reprendre l’événement n’importe où, même sur l’espace blanc entre les ticks.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top