2010-09-26 8 views
13

Sto costruendo un controllo di Windows Presentation Foundation con Microsoft Blend.WPF mouseDown => Nessun MouseLeave Evento

Quando esco dal mio controllo premendo il tasto sinistro del mouse, l'evento MouseLeave non viene generato. Perchè no?

+0

cosa c'è dentro il vostro controllo? Sto pensando che questo è perché l'oggetto (per esempioun pulsante) all'interno del controllo che ha ricevuto l'evento MouseDown ha impostato il "Mouse.IsCaptured" su true in modo che gestisca esclusivamente MouseEvents. – ASanch

+0

Questo è solo un bordo, una griglia, un'immagine di 2 etichette. È possibile? –

+0

Stiamo riscontrando lo stesso problema (vedere la domanda: http://stackoverflow.com/questions/15970248/wpf-mouse-leave-event-doesnt-trigger-with-mouse-down). Quindi ho iniziato una taglia qui per attirare l'attenzione. – SiberianGuy

risposta

7

Questo comportamento è destinato: Quando si sta facendo mousedown su un controllo e lasciando il controllo, il controllo conserva ancora il suo "catturare" sul mouse, il che significa il controllo non si attiva il MouseLeave-Event. Il mouse-Lascia Evento invece sarà licenziato, una volta che il mousebutton viene rilasciato al di fuori del controllo.

Per evitare questo, è possibile semplice dire al vostro controllo non per catturare il mouse a tutti:

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

Ora il MouseLeave evento saranno licenziati, anche quando si spostano fuori mentre si preme un pulsante.

Se è necessario l'acquisizione all'interno del controllo, è necessario mettere in uno sforzo maggiore:

  • iniziare a monitorare il mouseposition manualmente, quando si preme il MouseKey

  • Confrontare la posizione con la Top , Left e Size Attributi del controllo in questione.

  • Decidere se è necessario interrompere il controllo catturando il 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"); 
    } 
    

    }

naturalmente è necessario per fermare il proprio inseguimento (myCapture=false;) su MouseUp. Hai dimenticato che uno :)

+1

Ma cosa succede se ho bisogno di aumentare MouseLeave quando il mouse lascia l'intera finestra? Credo che non riceverò eventi MouveMouve quando il mouse è fuori dalla finestra, quindi la soluzione basata su MouseMove non funzionerà. O mi sbaglio? – SiberianGuy

+0

@Idsa Funziona anche per i moduli. – dognose

+1

Ma stiamo parlando di WPF qui. Dubito che funzionerà per la finestra WPF – SiberianGuy

2

Quando non ricevo gli eventi del mouse, mi aspetto che in genere utilizzi Snoop per aiutarmi a capire cosa sta succedendo.

Qui ci sono un paio di link:

1- Snoop (a WPF utility)
2- CodePlex project for Snoop

+3

Questo in realtà non risponde alla domanda. –

1

E per ragioni di completezza e storiche (non il bounty - che non ha senso avere due domande duplicati - probabilmente si dovrebbe spostare in uno se non è troppo tardi) ...

ho fatto una soluzione completa utilizzando global mouse hook qui (approccio 2)
WPF: mouse leave event doesn't trigger with mouse down

e semplificato il suo utilizzo - si può utilizzare legandosi ai comandi nella vista modello - ad esempio,

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

... maggiori dettagli in là