Я признаю, что удаленный ответ от Hans Passant немного помог в создании этого ответа.
Прежде всего, ваш код работает нормально. Если вы работаете с событиями, которые происходят довольно часто (например, MouseEvents), вы должны добавить Debug.WriteLine
в свой код, чтобы вы могли видеть в окне вывода отладчика события, для которых элементы управления, в каком порядке.
Основная проблема заключается в том, что из-за того, что числовой элемент управления вверх/вниз является элементом управления, состоящим из двух разных дочерних элементов управления, ваше событие MouseLeave вызывается, как только мышь входит в один из двух дочерних элементов управления. Что происходит: MouseEnter вызывается, когда мышь попадает на границу одной строки элемента управления, а MouseLeave называется моментом, когда мышь больше не находится на этой линии. В MouseLeave вы устанавливаете Label в строку emtpy. Это создает впечатление, что ваш код не работает.
Просто добавив цикл, чтобы перейти через любые дочерние элементы управления, эта проблема решается. Это по-прежнему часто устанавливает ярлык в пустую строку, но при необходимости сразу же устанавливается правильный текст.
Вот измененный код с инструкциями Debug на месте.
public static void addHovertip(ToolStripStatusLabel lb, Control c, string tip)
{
c.MouseEnter += (sender, e) =>
{
Debug.WriteLine(String.Format("enter {0}", c));
lb.Text = tip;
};
c.MouseLeave += (sender, e) =>
{
Debug.WriteLine(String.Format("Leave {0}", c));
lb.Text = "";
};
// iterate over any child controls
foreach(Control child in c.Controls)
{
// and add the hover tip on
// those childs as well
addHovertip(lb, child, tip);
}
}
Для полноты здесь это событие Load моей тестовой формы:
private void Form1_Load(object sender, EventArgs e)
{
addHovertip((ToolStripStatusLabel) statusStrip1.Items[0], this.numericUpDown1, "fubar");
}
Вот анимированный GIF демонстрирует, что происходит, когда вы перемещаете мышь внутри и вне контроля Числовой Up Down:
![numeric up down control and mouse event debug output](https://i.stack.imgur.com/aoj7J.gif)
спасибо, работает как шарм :) – someone