Pregunta

Probé este XAML:

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

Y este C #:

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

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

La variable sliderMouseDown nunca cambia porque los eventos MouseLeftButtonDown y MouseLeftButtonUp nunca se generan. ¿Cómo puedo hacer que este código funcione cuando un usuario tiene presionado el botón izquierdo del mouse en un control deslizante para tener un valor bool establecido en verdadero, y cuando el mouse está arriba, el valor bool está configurado en falso?

¿Fue útil?

Solución

Los controles deslizantes tragan los eventos MouseDown (similar al botón).

Puede registrarse para los eventos PreviewMouseDown y PreviewMouseUp que se activan antes de que el control deslizante tenga la oportunidad de manejarlos.

Otros consejos

Otra forma de hacerlo (y posiblemente mejor dependiendo de su escenario) es registrar un controlador de eventos en un código de procedimiento como el siguiente:

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

Tenga en cuenta el verdadero argumento. Básicamente dice que quieres recibir ese evento incluso si se ha marcado como manejado. Desafortunadamente, conectar un controlador de eventos como este solo se puede hacer desde un código de procedimiento y no desde xaml.

En otras palabras, con este método, puede registrar un controlador de eventos para el evento normal (que burbujea) en lugar del evento de vista previa que los túneles (y, por lo tanto, ocurren en diferentes momentos).

Consulte la barra lateral de Digging Deeper en la página 70 de WPF Unleashed para obtener más información.

Intente usar LostMouseCapture y GotMouseCapture.

    private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)

    private void slider_GotMouseCapture(object sender, MouseEventArgs e)

GotMouseCapture se activa cuando el usuario comienza a arrastrar el control deslizante y LostMouseCapture cuando lo lanza.

Me gustaría mencionar que el control deslizante no se traga todo el evento MouseDown. Al hacer clic en una marca de verificación, puede ser notificado para el evento. El control deslizante no manejará los eventos de MouseDown a menos que provengan del control deslizante ... del control deslizante.

Básicamente, si decides usar el

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

versión con las marcas activadas, asegúrese de que el evento se haya manejado previamente. Si no lo hace, terminará con un caso de borde en el que pensó que se hizo clic en el control deslizante, pero en realidad fue un tic. Inscribirse en el evento Preview es aún peor: lo recogerá en cualquier lugar, incluso en el espacio en blanco entre marcas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top