evento MouseHover / MouseLeave su tutta intera finestra
-
19-09-2019 - |
Domanda
Ho sottoclasse form con gestori per MouseHover
e MouseLeave
. Quando il puntatore si trova sullo sfondo della finestra, gli eventi funzionano bene, ma quando il puntatore entra in un controllo di all'interno della finestra, che provoca un evento MouseLeave
.
Esiste un modo per avere un evento che copre l'intera finestra.
(. NET 2.0, Visual Studio 2005, Windows XP).
Soluzione
Quando l'evento congedo mouse viene licenziato una possibilità è quella di verificare la posizione corrente del puntatore e vedere se all'interno dell'area di modulo. Io non sono sicuro se una migliore opzione è disponibile.
Modifica: Abbiamo una domanda simile che potrebbe essere di vostro interesse. Come rilevare se il mouse si trova all'interno delle intere controlli di modulo e bambino in C #?
Altri suggerimenti
Override l'evento MouseLeave di non innescare fino a quando il mouse entra un controllo figlio
protected override void OnMouseLeave(EventArgs e)
{
if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
return;
else
{
base.OnMouseLeave(e);
}
}
Non v'è alcun buon modo per fare MouseLeave affidabile per un controllo contenitore. Punt questo problema con un timer:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
timer1.Interval = 200;
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Enabled = true;
}
private bool mEntered;
void timer1_Tick(object sender, EventArgs e) {
Point pos = this.PointToClient(Cursor.Position);
bool entered = this.ClientRectangle.Contains(pos);
if (entered != mEntered) {
mEntered = entered;
if (!entered) {
// Do your leave stuff
//...
}
}
}
}
Il controllo utente creare un evento MouseHover per il controllo di questo tipo, (o altro tipo di evento) come questo
private void picBoxThumb_MouseHover(object sender, EventArgs e)
{
// Call Parent OnMouseHover Event
OnMouseHover(EventArgs.Empty);
}
Sul vostro WinForm che ospita l'UserControl ha questo per l'UserControl per gestire il MouseOver in modo da mettere questo nel tuo Designer.cs
this.thumbImage1.MouseHover += new System.EventHandler(this.ThumbnailMouseHover);
che chiama questo metodo sul vostro WinForm
private void ThumbnailMouseHover(object sender, EventArgs e)
{
ThumbImage thumb = (ThumbImage) sender;
}
Dove ThumbImage è il tipo di UserControl