Я думаю, что есть несколько разных способов сделать это, но ключом является ваше желание иметь тайм-аут на действии. Я думаю, что сочетание двух методов может работать:
Поместите элемент управления на панель, закрепите, чтобы заполнить, и используйте MouseEnter на панели, чтобы включить ваше поведение - это будет включать полосу прокрутки элемента управления. Вы также можете использовать событие MouseLeave панели, но вам нужно будет проверить положение курсора, чтобы убедиться, что он не переместился в содержащийся элемент управления. Этот метод в основном надежен, но быстрое перемещение мыши может запутать его.
Если вы объедините это с таймером, который запускается, когда отображается показанный / скрытый элемент управления, и периодически проверяйте положение курсора. Это будет работать, но ваш тайм-аут перед сокрытием элемента управления не обязательно будет согласованным (потому что таймер запускается, когда они входят в элемент управления). Вы можете остановить / запустить таймер при перемещении мыши в элементе управления, чтобы несколько смягчить это.
Я собрал проект различных методов, которые я попробовал здесь: http://lovethedot.s3.amazonaws.com/100609StackoverflowScrollbarQuestion.zip
Закрепив элемент управления, который вы хотите отслеживать на панели, он по сути оборачивает его, и вы получите MouseEnter на самом краю отслеживаемого элемента управления:
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";
}
Вы отслеживаете вход в панель, окружающую элемент управления, и выходите из нее, если курсор не находится внутри отслеживаемого элемента управления.
Чтобы получить лучший опыт «отпуска», он объединен с таймером, который проверяет, где находится курсор:
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;
}
}