winforms 更改延迟时间ToolStripButton上的ToolTipText

ffdz8vbo  于 2023-06-24  发布在  其他
关注(0)|答案(3)|浏览(158)

应用程序是在C#/WinForm我使用ToolStrip与按钮。
我设置了ToolTipText,它正在工作。
我可以将延迟时间更改为更长的值吗?
在其他控件中,我使用工具提示控件,这是可能的(AutoPopDelay值)。

6gpjuf90

6gpjuf901#

这是可能的,但不像你想象的那么简单。
ToolStrip控件在具有内部ToolTip属性时不公开ToolTip属性。此外,该控件不依赖于自动工具提示行为,而是在Hover事件上手动显示工具提示。这里的问题是,悬停事件也有一个依赖于内部计时器的自定义实现。
考虑到上述事实,你可以想象如何hacky是改变toolstrip的工具提示延迟的解决方案,你决定它是否值得,但这里是解决方案:

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”。当我们依赖于内部实现细节时,这就是问题所在,但有时这是不可避免的。

1l5u6lss

1l5u6lss2#

在我的另一个答案中,我已经展示了如何修改初始延迟,但正如Elmue在评论中指出的那样,OP似乎正在寻找AutoPopDelay,这是显示工具提示的持续时间。
为此,您可以获取ToolStrip的内部ToolTip并设置其属性:

private void Form1_Load(object sender, EventArgs e)
{
    var toolTip = (ToolTip)this.toolStrip1.GetType()
        .GetProperty("ToolTip",
        System.Reflection.BindingFlags.NonPublic |
        System.Reflection.BindingFlags.Instance).GetValue(toolStrip1);
    toolTip.AutoPopDelay = 10000;
}
eh57zj3b

eh57zj3b3#

这里有一个完全不同的方法,你应该总是避免,除非你知道你正在改变一个系统范围的设置,这不会影响你的应用程序。
正如我在另一个答案中提到的,有一个内部计时器负责显示工具提示的悬停时间,计时器的默认间隔是SystemInformation.MouseHoverTime的值。
您可以使用SystemParametersInfo更改该值。此值是一个系统范围的设置,如果您更改它,它将应用于依赖此值的所有应用程序。也就是说,你决定是否要改变它,但这里是解决方案:
假设您创建了以下helper类:

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);
}

相关问题