Domanda

Ho provato questo XAML:

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

E questo C #:

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

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

La variabile sliderMouseDown non cambia mai perché gli eventi MouseLeftButtonDown e MouseLeftButtonUp non vengono mai generati. Come posso far funzionare questo codice quando un utente ha il tasto sinistro del mouse su uno slider per avere un valore bool impostato su true e quando il mouse è su, il bool è impostato su false?

È stato utile?

Soluzione

I cursori inghiottono gli eventi MouseDown (simili al pulsante).

Puoi registrarti agli eventi PreviewMouseDown e PreviewMouseUp che vengono attivati ??prima che il dispositivo di scorrimento abbia la possibilità di gestirli.

Altri suggerimenti

Un altro modo per farlo (e forse meglio a seconda del tuo scenario) è quello di registrare un gestore di eventi in codice procedurale come il seguente:

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

Nota l'argomento vero. Fondamentalmente dice che vuoi ricevere quell'evento anche se è stato contrassegnato come gestito. Sfortunatamente, collegare un gestore di eventi come questo può essere fatto solo dal codice procedurale e non da xaml.

In altre parole, con questo metodo, è possibile registrare un gestore di eventi per l'evento normale (che bolle) anziché l'evento di anteprima quali tunnel (e quindi si verificano in momenti diversi).

Vedi la barra laterale di Digging Deeper a pagina 70 di WPF Unleashed per maggiori informazioni.

Prova a usare LostMouseCapture e GotMouseCapture.

    private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)

    private void slider_GotMouseCapture(object sender, MouseEventArgs e)

GotMouseCapture si attiva quando l'utente inizia a trascinare il dispositivo di scorrimento e LostMouseCapture quando lo rilascia.

Vorrei menzionare che lo Slider non inghiotte completamente l'intero evento MouseDown. Facendo clic su un segno di spunta, puoi ricevere una notifica per l'evento. Il dispositivo di scorrimento non gestirà gli eventi MouseDown a meno che non provengano dal ... dispositivo di scorrimento.

Fondamentalmente se decidi di usare

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

versione con i segni di spunta attivati, assicurati che l'evento sia stato gestito in precedenza. In caso contrario, ti ritroverai con un caso limite in cui pensavi che fosse stato fatto clic sul dispositivo di scorrimento, ma era davvero un segno di spunta. La registrazione per l'evento Preview è ancora peggio: raccoglierai l'evento ovunque, anche nello spazio bianco tra le zecche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top