当 MouseEnter 时,NumericUpDown 没有改变 ToolStripStatusLabel
NumericUpDown is not changing ToolStripStatusLabel when 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 = "";
};
}
我承认 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 控件时发生的情况:
我使用此代码实现悬停 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 = "";
};
}
我承认 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 控件时发生的情况: