【问题标题】:WinForms tooltips not showing upWinForms 工具提示未显示
【发布时间】:2014-11-28 16:15:25
【问题描述】:

我有一个 WinForms 应用程序。每个表单和用户控件设置其工具提示如下:

// in the control constructor
var toolTip = new ToolTip();
this.Disposed += (o, e) => toolTip.Dispose();
toolTip.SetToolTip(this.someButton, "...");
toolTip.SetToolTip(this.someCheckBox, "...");
...

但是,当我将鼠标悬停在控件上时,工具提示不会出现。这是使用工具提示的适当方式吗?应用程序的另一部分(例如,监听某些事件)中是否发生了会阻止工具提示工作的事情?

请注意,我的外部表单的工具条按钮(通过按钮的工具提示属性配置)上的工具提示确实可以按预期工作。

编辑:

我对此进行了更多观察,并且注意到有时会出现工具提示,它只是非常“不稳定”。基本上,有时当我将鼠标悬停在控件上时,它会非常短暂地显示出来,然后闪烁消失。我可以使用 .Show() 和较长的 AutoPopDelay 手动显示它,但它永远不会消失!

【问题讨论】:

  • 不确定您在其他地方做什么,但您的代码对我有用,您确定启用了用户控件吗?
  • @MarkHall 我是否必须明确将 enabled 属性设置为 true?控件上的所有按钮、文本框等都可以正常工作。
  • 不,你没有。它将继承父母状态。某些东西可能会将焦点从控件上移开。尝试将处理程序附加到 ToolTip 的 Popup 事件并查看它是否被触发。
  • @ChaseMedallion 我有时也有这个问题,现在(再次)在这里寻求答案。就我而言,在我取消隐藏标签页之前,TT 不起作用,即使带有 TT 的控件甚至不参与标签控件。 PS 几乎没有人告诉你他们为什么投反对票。这很烦人。至少有足够的资金来解释你的不满,对吧?
  • 不是一个答案,而是一个观察:在我最近的案例中,如果我从集合中删除一个标签页(在这种情况下是最右边的,但我没有测试过其他人)。如果我没有删除标签页,或者重新插入它,它显示得很好。奇怪。

标签: c# winforms user-controls tooltip


【解决方案1】:

当我的工具提示没有出现在 RichTextBox 上一次时,我遇到了类似的问题,大约是正常情况下应该出现的 3-5 次。即使使用 toolTip.Show 强制它显式显示也无济于事。直到我改成 Shell 提到的方式 - 你必须告诉 哪里 你希望你的工具提示出现:

'Dim pnt As Point
pnt = control.PointToClient(Cursor.Position)
pnt.X += 10 ' Give a little offset
pnt.Y += 10 ' so tooltip will look neat
toolTip.Show(text, control, pnt)

这样,我的工具提示总是会出现在何时在哪里预期。 祝你好运!

【讨论】:

  • 我可以确认此解决方法有效。这个问题是一个丑陋的 Windows 10 错误。很难复制。它发生在一个表单中,而在另一个具有相同代码的表单中则不会发生。大多数情况下,工具提示出现一次,然后永远消失。一个非常丑陋的 Windows 错误!
【解决方案2】:

您的代码对我来说似乎没问题。我在您的代码中找不到任何错误。但是,只有在禁用控制时才会失败。顺便说一句,你可以试试这样的另一种方法。但是,我不建议您像这样显示工具提示。

private void someButton_MouseEnter(...)
{
    toolTip.Show("Tooltip text goes here", (Button)sender);
}

您还可以在.Show() 方法中指定工具提示应显示的位置。您可以使用一些重载函数。阅读msdn,了解有关ToolTip.Show() 方法的更多信息。

【讨论】:

    【解决方案3】:

    我编写了以下方法来将工具提示从父控件(具有工具提示集)“传播”到其子控件(除非它们具有自己的覆盖工具提示)。

    它旨在放入您开始使用的表单或控件中,但也可以将其转换为需要“父”参数的静态方法。

    /// <summary>Setting a toolTip on a custom control unfortunately doesn't set it on child
    /// controls within its drawing area. This is a workaround for that.</summary>
    private void PropagateToolTips(Control parent = null)
    {
        parent = parent ?? this;
        string toolTip = toolTip1.GetToolTip(parent);
        if (toolTip == "")
            toolTip = null;
        foreach (Control child in parent.Controls)
        {
            // If the parent has a toolTip, and the child control does not
            // have its own toolTip set - set it to match the parent toolTip.
            if (toolTip != null && String.IsNullOrEmpty(toolTip1.GetToolTip(child)))
                toolTip1.SetToolTip(child, toolTip);
            // Recurse on the child control
            PropagateToolTips(child);
        }
    }
    

    请注意,如果您使用多个 ToolTip 实例来管理父子控件工具提示,则行为未定义。

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多