2008-10-02 20 views
14

Probé este XAML:WPF: Deslizador duerma elevar MouseLeftButtonDown o MouseLeftButtonUp

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

Y esto 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 acontecimientos MouseLeftButtonDown y MouseLeftButtonUp Nunca se levantan. ¿Cómo puedo hacer que este código funcione cuando un usuario tiene el botón izquierdo del mouse en un control deslizante para tener un valor bool establecido en verdadero, y cuando el mouse está activo, el bool se establece en falso?

Respuesta

14

Los controles deslizantes se 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 posibilidad de manejarlos.

+0

Gracias, pude usar el evento IsMouseCapturedWithinChanged en combinación con los eventos PreviewMouseLeftButtonUp para lograr mi objetivo final. – Nick

+0

¿Alguien conoce la razón de este comportamiento? – PeterAllenWebb

+0

El motivo de este comportamiento es que el botón maneja el evento MouseDown. De forma predeterminada, si algún control indica que ha manejado un evento, nadie más recibe una notificación a menos que haya especificado que también quiere ver los eventos manejados. –

16

Otra manera de hacerlo (y posiblemente mejor, dependiendo del escenario) es registrar un controlador de eventos en el 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 desea recibir ese evento, incluso si se ha marcado como manejado. Lamentablemente, conectar un controlador de eventos como este solo se puede hacer desde el 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 hace túneles (y por lo tanto ocurre en momentos diferentes).

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

+1

Usar este truco parece ser el tipo de truco que podría hacer su trabajo (o el de otra persona) mucho más difícil en el futuro. ¿Es realmente una buena idea? – PeterAllenWebb

+0

No lo llamaría un truco. Sin embargo, dicho esto, trataría de evitar usarlo si es posible, pero si estás entre el rock y un lugar difícil ... Déjame explicarte. Los eventos de vista previa se disparan antes de los eventos regulares. Por lo tanto, utilizar los eventos de vista previa no siempre funciona en la situación en cuestión. – cplotts

+0

Es la "única" forma en que podemos hacer que Wpf funcione dentro de nuestra aplicación MFC. Los eventos de vista previa mezclan nuestros mensajes dentro de la aplicación. –

1

Me gustaría mencionar que el control deslizante no acaba de tragar todo el evento MouseDown. Al hacer clic en una marca, puede recibir notificaciones para el evento. El Control deslizante no manejará eventos MouseDown a menos que provengan del control deslizante del control deslizante.

Básicamente, si usted decide utilizar la versión

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

con las garrapatas encendidos, asegúrese de que el caso fue manejado con anterioridad. Si no lo haces, terminarás con un caso marginal en el que pensaste que se hizo clic en el control deslizante, pero fue realmente un tic. El registro para el evento de vista previa es aún peor: retomarás el evento en cualquier lugar, incluso en el espacio en blanco entre tics.

4

Pruebe usar LostMouseCapture y GotMouseCapture.

private void sliderr_LostMouseCapture(object sender, MouseEventArgs e) 

    private void slider_GotMouseCapture(object sender, MouseEventArgs e) 

incendios GotMouseCapture cuando el usuario comienza a arrastrar el control deslizante, y LostMouseCapture cuando lo suelte.

Cuestiones relacionadas