2010-09-26 12 views
13

Estoy creando un control de Windows Presentation Foundation con Microsoft Blend.WPF Mousedown => Ningún evento MouseLeave

Cuando dejo mi control presionando el botón izquierdo del mouse, MouseLeave-Event no se levanta. Por qué no?

+0

lo que está dentro de su control? Estoy pensando que esto se debe a que el objeto (p.un Botón) dentro de su control que recibió el evento MouseDown ha establecido el "Mouse.IsCaptured" en verdadero, por lo que se trata exclusivamente de los MouseEvents. – ASanch

+0

Eso es solo un borde, cuadrícula, imagen y 2 etiquetas. ¿Es eso posible? –

+0

Estamos experimentando el mismo problema (vea la pregunta: http://stackoverflow.com/questions/15970248/wpf-mouse-leave-event-doesnt-trigger-with-mouse-down). Así que he comenzado una recompensa aquí para llamar la atención. – SiberianGuy

Respuesta

7

Este comportamiento se pretende: Cuando usted está haciendo mousedown en un control y dejando el control, el control conserva su TODAVÍA "capturar" en el mouse, lo que significa que el control no activará el MouseLeave-Event. En su lugar, se disparará el evento Mouse-Leave, una vez que se suelta el botón del mouse fuera del control.

Para evitar esto, se puede decir a su sencillo control para no capturar el ratón en absoluto:

private void ControlMouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    Control control = (Control) sender; 
    control.Capture = false; //release capture. 
} 

Ahora el MouseLeave evento se disparará incluso cuando se mueve mientras se presiona un botón.

Si necesita la captura dentro del control, es necesario poner más esfuerzo:

  • iniciar el seguimiento de la mouseposition manualmente, cuando se pulsa el MouseKey

  • comparar la posición con el Top , Left y Size Atributos del control en cuestión.

  • Decida si necesita detener el control capturando el mouse o no.

    public partial class Form1 : Form 
    { 
    private Point point; 
    private Boolean myCapture = false; 
    
    public Form1() 
    { 
        InitializeComponent(); 
    } 
    
    private void button1_MouseDown(object sender, MouseEventArgs e) 
    { 
        myCapture = true; 
    } 
    
    private void button1_MouseMove(object sender, MouseEventArgs e) 
    { 
        if (myCapture) 
        { 
         point = Cursor.Position; 
    
         if (!(point.X > button1.Left && point.X < button1.Left + button1.Size.Width && point.Y > button1.Top && point.Y < button1.Top + button1.Size.Height)) 
         { 
          button1.Capture = false; //this will release the capture and trigger the MouseLeave event immediately. 
          myCapture = false; 
         } 
        } 
    } 
    
    private void button1_MouseLeave(object sender, EventArgs e) 
    { 
        MessageBox.Show("Mouse leaving"); 
    } 
    

    }

, por supuesto, tiene que dejar el propio sistema de seguimiento (myCapture=false;) en MouseUp. Ha olvidado que uno :)

+1

Pero, ¿qué sucede si tengo que levantar MouseLeave cuando el mouse sale de toda la ventana? Supongo que no recibiré eventos de MouveMouve cuando el mouse esté fuera de la ventana para que su solución basada en MouseMove no funcione. ¿O estoy equivocado? – SiberianGuy

+0

@Idsa Funciona también para formularios. – dognose

+1

Pero estamos hablando de WPF aquí. Dudo que funcione para WPF Window – SiberianGuy

1

Y para la integridad e históricos razones (no la generosidad - que no tiene sentido tener dos cuestiones duplicados - probablemente debería moverlo a uno si no es demasiado tarde) ...

hice una solución de fondo usando global mouse hook aquí (método 2)
WPF: mouse leave event doesn't trigger with mouse down

y simplificado su uso - se puede usar mediante la unión a los comandos en la vista-modelo - por ejemplo,

my:Hooks.EnterCommand="{Binding EnterCommand}" 
my:Hooks.LeaveCommand="{Binding LeaveCommand}" 
my:Hooks.MouseMoveCommand="{Binding MoveCommand}" 

... más detalles en allí

Cuestiones relacionadas