0

我正在练习创建自定义控件。自定义控件是一个简单的标签继承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);
}

工具提示不使用任何配置。

当我将鼠标悬停在标签上时(尽管您看不到鼠标): 在此处输入图像描述

现在,在我离开控件并将鼠标悬停在第二个标签上之后: 在此处输入图像描述

当您将鼠标悬停在 aMS Label上时,工具提示会出现,然后立即消失。如何更好地复制标准 MS 标签显示的行为?

4

3 回答 3

0

我会使用MouseEnter事件而不是MouseMove. 您可以使用 aTimer使其不会立即显示,而是在短时间内显示。

例如:

// 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();      
}
于 2013-01-12T22:15:48.260 回答
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覆盖。

此外,我还调整了一些似乎对我有用的设置。

于 2013-01-12T22:27:34.000 回答
0

您不需要在每次想要显示它时都设置工具提示。

您应该在控件构造函数中设置它:

m_toolTip.SetToolTip(this, Text);

然后工具提示的显示和隐藏会自动为您完成,无需您编写任何额外的代码。

于 2013-01-12T22:35:36.700 回答