Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 工具提示。非活动窗口的显示不';t工作_C#_Winforms_Tooltip - Fatal编程技术网

C# 工具提示。非活动窗口的显示不';t工作

C# 工具提示。非活动窗口的显示不';t工作,c#,winforms,tooltip,C#,Winforms,Tooltip,当包含控件的窗口处于非活动状态时,为什么使用tooltip.Show手动显示的工具提示不显示 public class MyControl : Button { private _tip; public string ToolTip { get { return _tip; } set { _tip = value; } } private ToolTip _toolTip = new ToolTip(); p

当包含控件的窗口处于非活动状态时,为什么使用
tooltip.Show
手动显示的工具提示不显示

public class MyControl : Button
{

    private _tip;
    public string ToolTip
    {
        get { return _tip; }
        set { _tip = value; }
    }

    private ToolTip _toolTip = new ToolTip();

    public MyControl()
    {
        _toolTip.UseAnimation = false;
        _toolTip.UseFading = false;
        _toolTip.ShowAlways = true;
    }

    protected override void OnMouseHover(EventArgs e)
    {
        _toolTip.Show(_tip, this, 0, Height);
        base.OnMouseHover(e);
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        _toolTip.Hide(this);
        base.OnMouseLeave(e);
    }
}
我选择了
ToolTip.Show
,因为我必须在屏幕上无限时间地显示工具提示,这在正常的
工具提示中是不可能的。我也喜欢将工具提示文本作为控件本身的一部分。但不幸的是,当以这种方式为非活动窗口显示工具提示时(尽管
ShowAlways=true
),它根本不起作用

会引发
OnMouseHower
事件,但
\u工具提示.Show
不执行任何操作。。除非窗口被激活,否则一切正常

赏金
为解决方案添加悬赏以显示非活动窗体的工具提示(当工具提示文本是控件的属性而不是
IContainer
时,最好使用解决方案)。

有一个私有方法可以执行您想要的操作,因此要访问它,您必须使用反射来调用它:

using System.Reflection;

public class MyControl : Button {
  private ToolTip toolTip = new ToolTip() {
    UseAnimation = false,
    UseFading = false
  };

  public string ToolTip { get; set; }

  protected override void OnMouseHover(EventArgs e) {
    base.OnMouseHover(e);
    Point mouse = MousePosition;
    mouse.Offset(10, 10);
    MethodInfo m = toolTip.GetType().GetMethod("SetTool",
                           BindingFlags.Instance | BindingFlags.NonPublic);
    m.Invoke(toolTip, new object[] { this, this.ToolTip, 2, mouse });
  }

  protected override void OnMouseLeave(EventArgs e) {
    base.OnMouseLeave(e);
    toolTip.Hide(this);
  }
}

提示将显示在非活动窗口上,并将无限期地留在屏幕上,直到鼠标离开控件。

@SriramSakthivel,我在哪里说过
禁用控件
?我说
非活动窗口
,但可能应该说
非活动窗体
。对不起,我的错。忽略了这是故意的。从中,当容器处于非活动状态时,不会显示工具提示。
@LarsTech,但如果我开始使用普通的工具提示,则设置
ShowAlways=true然后使窗体处于非活动状态-它可以工作,但不会无限期地停留在屏幕上。所以我需要一个解决方案来杀死这两只兔子-不确定的非活动形式的工具提示。谢谢,但这只会在屏幕上保留工具提示最多5秒(我在问题本身和评论中提到“无限时间”)。我没有想到控件内托管的工具提示(如果可以命名的话)的
SetToolTip
。所以这个想法很有用,但还不是我需要的完美解决方案。它是一个奇迹,谢谢!你能告诉我,你是如何找到这个
SetTool
方法的吗?这个神奇的
2
是什么意思(我发现它是
ToolTip.TipInfo.Type
,但我找不到实际存在的类型)。另一个问题是为什么偏移量(10,10)
?它工作正常(似乎从光标向右,垂直居中到最低点),但我对自定义光标有些怀疑(但我不知道该怎么做才能得到这个神奇的
10
光标。大小是32;32,热点是0;0,所以idk)。@Sinatr我看了看屏幕。2表示尖端枚举类型。绝对值。(10,10)偏移是因为如果笔尖出现在鼠标光标正下方,它会闪烁。@LarsTech:再次感谢您提供此解决方案。你救了我一天!