当 MouseEnter 时,NumericUpDown 没有改变 ToolStripStatusLabel

NumericUpDown is not changing ToolStripStatusLabel when MouseEnter

我使用此代码实现悬停 tooltip,它适用于 TextBoxComboBoxMaskedTextBox,但不适用于 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 = "";

            };
        }

我承认 Hans Passant 删除的答案对创建此答案有帮助。

首先你的代码工作正常。如果您正在处理经常发生的事件(如 MouseEvents),您最好在代码中添加一个 Debug.WriteLine,这样您就可以在调试器输出 Window 中看到哪些事件,哪些控件,在哪些订单发生。

主要问题是,由于数字 up/down 控件是一个由两个不同的子控件组成的控件,一旦鼠标进入两个子控件之一,您的 MouseLeave 事件就会被调用控制。发生的情况是:当鼠标点击控件的单行边框时调用 MouseEnter,当鼠标不再位于该行时调用 MouseLeave。在 MouseLeave 中,您将 Label 设置为空字符串。这给人的印象是您的代码不起作用。

只需添加一个循环遍历任何子控件即可解决此问题。这仍然会经常将标签设置为空字符串,但如果需要,它也会立即设置为正确的文本。

这里是修改后的代码,其中包含 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 动画,演示了将鼠标移入和移出 Numeric Up Down 控件时发生的情况: