我正在进行一项练习来创建自定义控件。自定义控件是继承Control
的简单标签。
使用以下工具提示码:
m_toolTip = new ToolTip();
protected override void OnMouseMove(MouseEventArgs e) {
m_toolTip.SetToolTip(this, Text);
base.OnMouseMove(e);
}
protected override void OnMouseLeave(EventArgs e) {
m_toolTip.RemoveAll();
base.OnMouseLeave(e);
}
工具提示没有使用任何配置。
当我将鼠标悬停在标签上时(虽然你看不到鼠标):
现在,在我离开控件并将鼠标悬停在第二个标签上之后:
当您将鼠标悬停在MS Label
上时,工具提示会显示,然后立即消失。如何更好地复制标准MS标签显示的行为?
答案 0 :(得分:0)
我会使用MouseEnter
事件代替MouseMove
。您可以使用Timer
,以便它不会立即显示,而是在很短的时间后显示。
例如:
// Member Variables
ToolTip toolTip = new ToolTip();
string toolTipText = "Your tool tip goes here.";
Timer toolTipTimer = new Timer();
public TimeSpan ToolTipDelay
{
get { return TimeSpan.FromMilliseconds(toolTipTimer.Interval); }
set { toolTipTimer.Interval = (int)value.TotalMilliseconds; }
}
// Call this in your CustomControl constructor!
void InitializeToolTipTimer()
{
this.ToolTipDelay = TimeSpan.FromSeconds(1);
toolTipTimer.Tick += (sender, e) =>
{
toolTipTimer.Stop(); // Tick only once per MouseEnter
toolTip.SetToolTip(this, toolTipText);
};
}
void OnToolTipMouseEnter(object sender, EventArgs e)
{
toolTipTimer.Start(); // Start the ToolTip display Timer
}
void OnToolTipMouseLeave(object sender, EventArgs e)
{
toolTipTimer.Stop(); // Cancel any pending ToolTip display
toolTip.RemoveAll();
}
答案 1 :(得分:0)
我通过以下更改解决了问题:
protected override void OnMouseHover(EventArgs e) {
var m_position = PointToClient(Control.MousePosition);
m_toolTip.Show(Text, this, m_position.X + 10, m_position.Y, 20000);
base.OnMouseHover(e);
}
我删除了之前的OnMouseMove
覆盖。
此外,我还调整了一些似乎对我有用的设置。
答案 2 :(得分:0)
每次要显示工具提示时都不需要设置工具提示。
您应该在控件构造函数中设置它:
m_toolTip.SetToolTip(this, Text);
然后自动为您显示和隐藏工具提示,而无需编写任何额外的代码。