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?
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?
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 :)
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
@Idsa Funziona anche per i moduli. – dognose
Ma stiamo parlando di WPF qui. Dubito che funzionerà per la finestra WPF – SiberianGuy
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:
Questo in realtà non risponde alla domanda. –
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à
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
Questo è solo un bordo, una griglia, un'immagine di 2 etichette. È possibile? –
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