Ich denke, es gibt mehrere verschiedene Möglichkeiten, dies zu tun, aber der Schlüssel ist Ihr Wunsch, eine Zeitüberschreitung bei der Aktion zu haben. Ich denke, eine Kombination aus zwei Techniken könnte funktionieren:
Setzen Sie das Steuerelement auf ein Panel, angedockt, um zu füllen, und verwenden Sie den MouseEnter des Bedienfelds, um Ihr Verhalten zu aktivieren - das wird die Bildlaufleiste des Steuerelements enthalten. Sie können auch das MouseLeave-Ereignis des Bedienfelds verwenden. Sie müssen jedoch die Position des Cursors überprüfen, um sicherzustellen, dass er nicht in das enthaltene Steuerelement verschoben wurde. Diese Methode ist meist zuverlässig, aber wenn Sie die Maus schnell bewegen, kann das verwirren.
Wenn Sie dies mit einem Timer kombinieren, der startet, wenn Ihr angezeigtes/verdecktes Steuerelement angezeigt wird, und überprüfen Sie die Cursorposition in regelmäßigen Abständen. Dies funktioniert, aber Ihr Timeout vor dem Ausblenden des Steuerelements ist nicht unbedingt konsistent (weil der Zeitgeber beim Eingeben des Steuerelements gestartet wird). Sie können den Timer bei Mausbewegungen im Steuerelement stoppen/starten, um dies etwas zu verringern.
ich zusammen ein Projekt der verschiedenen Methoden, die ich hier versucht: http://lovethedot.s3.amazonaws.com/100609StackoverflowScrollbarQuestion.zip
Durch Andocken der Kontrolle, die Sie im Panel verfolgen wollen, ist es es im Wesentlichen umschließt, und Sie werden MouseEnter- am äußersten Rand des bekommen getrackten Kontrolle:
private void panel1_MouseEnter(object sender, EventArgs e)
{
this.Text = "in";
}
private void panel1_MouseLeave(object sender, EventArgs e)
{
if (!new Rectangle(new Point(0, 0), panel1.Size).Contains(panel1.PointToClient(Control.MousePosition)))
this.Text = "out";
}
Sie Tracking-Eintrag in das Panel der Steuerung umgibt, und Ausfahrt aus diesem Panel sofern der Cursor nicht innerhalb der verfolgten Kontrolle.
Um ein besseres „leave“ Erfahrung zu bekommen, ist es mit einem Timer kombiniert, die überprüft, wo sich der Cursor auch ist:
private void listBox3_MouseEnter(object sender, EventArgs e)
{
button1.Visible = true;
visibleTimer.Stop();
visibleTimer.Start();
}
void visibleTimer_Tick(object sender, EventArgs e)
{
if (!new Rectangle(new Point(0, 0), listBox3.Size).Contains(listBox3.PointToClient(Control.MousePosition)))
{
visibleTimer.Stop();
button1.Visible = false;
}
}
Der Panel Container eine gute Idee war, aber das funktioniert nicht, weil die Ereignisse nicht zu übergeordneten Steuerungen sprudelt ar ..., dass das gleiche sein würde, wie das Hinzufügen das mouseenter -Ereignis für das ganze Formular. Das Timeout und Timer ist kein Problem, die funktionieren gut. Trotzdem danke!! –