1

应用程序在 c#/WinForm 中我正在使用带有按钮的 ToolStrip。

我设置了 ToolTipText,它正在工作。

我可以将延迟时间更改为更长的值吗?

在其他控件中,我正在使用 ToolTip 控件并且它是可能的(AutoPopDelay 值)。

4

2 回答 2

1

这是可能的,但并不像您期望的那样简单。

ToolStrip控件在具有内部 ToolTip 属性时不公开ToolTip 属性。此外,该控件不依赖于自动工具提示行为,而是在Hover 事件上手动显示工具提示。这里的问题是悬停事件也有一个依赖于内部计时器的自定义实现。

考虑到以上事实,您可以想象更改工具条的工具提示延迟的解决方案是多么的骇人听闻,并且您决定是否值得,但这里是解决方案:

private void TestForm_Load(object sender, EventArgs e)
{
    var mouseHoverTimerProperty =
        toolStrip1.GetType().GetProperty("MouseHoverTimer",
        BindingFlags.NonPublic | BindingFlags.Instance)
        .GetValue(toolStrip1);
    var mouseHoverTimerField =(System.Windows.Forms.Timer)
        (mouseHoverTimerProperty.GetType().GetFields(
        BindingFlags.NonPublic | BindingFlags.Instance)
        .Where(x => x.FieldType == typeof(System.Windows.Forms.Timer)).First()
        .GetValue(mouseHoverTimerProperty));

    mouseHoverTimerField.Interval = 3000;
}

注意:您看到我使用其类型而不是名称找到私有字段的原因是因为“.NET Framework”实现中的字段名称是“ mouseHoverTimer”,而在“.NET (CORE/5 /6)" 是 " _mouseHoverTimer"。当我们依赖内部实现细节时,这就是问题所在,但有时这是不可避免的。

于 2022-02-02T21:00:04.103 回答
0

这是一种完全不同的方法,您几乎应该始终避免使用,除非您知道您正在更改系统范围的设置,而该设置不仅会影响您的应用程序。

正如我在另一个答案中提到的,有一个内部计时器负责悬停时间以显示工具提示,计时器的默认间隔是SystemInformation.MouseHoverTime的值。

您可以使用SystemParametersInfo更改该值。此值是系统范围的设置,如果您更改它,它将应用于依赖此值的所有应用程序。也就是说,您决定是否要更改它,但这里是解决方案:

假设您创建了以下帮助程序类:

using System.Runtime.InteropServices;
public static class SystemInformationExtensions
{
    private const int SPI_SETMOUSEHOVERTIME = 0x0067;

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern bool SystemParametersInfo(
        int nAction, int nParam, ref int value, int ignore);
    public static void SetMouseHoverTime(int milliseconds)
    {
        SystemParametersInfo(SPI_SETMOUSEHOVERTIME,
            milliseconds, ref milliseconds,0);
    }
}

然后你可以像这样使用它:

private void TestForm_Load(object sender, EventArgs e)
{
    SystemInformationExtensions.SetMouseHoverTime(3000);
}
于 2022-02-02T22:05:32.777 回答