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:

числовое управление

Другие вопросы по тегам