NumericUpDown не меняет ToolStripStatusLabel, когда MouseEnter
Я использовал этот код для реализации при наведении tooltip
работает с TextBox
, ComboBox
, MaskedTextBox
но не на NumericUpDown
, Кто-нибудь знает, почему это не работает?
public static void addHovertip(ToolStripStatusLabel lb, Control c, string tip)
{
c.MouseEnter += (sender, e) =>
{
lb.Text = tip;
// MessageBox.Show(c.Name);
};
c.MouseLeave += (sender, e) =>
{
lb.Text = "";
};
}
1 ответ
Я признаю, что удаленный ответ от Ханса Пассанта немного помог в создании этого ответа.
Прежде всего, ваш код работает нормально. Если вы работаете с событиями, которые происходят довольно часто (например, MouseEvents), вам лучше добавить Debug.WriteLine
к вашему коду, чтобы вы могли видеть в окне вывода отладчика, какие события, для каких элементов управления, в каком порядке происходят.
Основная проблема заключается в том, что из-за того, что числовой элемент управления вверх / вниз является элементом управления, который состоит из двух разных дочерних элементов управления, ваше событие MouseLeave вызывается, как только мышь входит в один из двух дочерних элементов управления. Происходит следующее: MouseEnter вызывается, когда мышь достигает границы одной строки элемента управления, а MouseLeave вызывается в тот момент, когда мышь больше не находится на этой строке. В MouseLeave вы устанавливаете метку для строки 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: