Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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# 有没有办法将控件设置为工具提示?_C#_Winforms_Controls_Tooltip - Fatal编程技术网

C# 有没有办法将控件设置为工具提示?

C# 有没有办法将控件设置为工具提示?,c#,winforms,controls,tooltip,C#,Winforms,Controls,Tooltip,我想知道是否可以使用ToolTip.SetToolTip或类似的工具提示来打开控件,而不仅仅是字符串(即SetToolTip(controlToWhichToAdd,paneltodisplayastoltip)而不是将字符串作为第二个参数传递) 如果这不可能,我猜下一个最好的方法是在控件上的mouse\u enter事件的鼠标位置上显示一个面板,然后在mouse\u leave上删除它(或使它不可见) 或者有其他更简单的方法来实现这一点吗?您可以为编写一个处理程序,然后取消弹出窗口以显示您自己

我想知道是否可以使用
ToolTip.SetToolTip
或类似的工具提示来打开控件,而不仅仅是字符串(即
SetToolTip(controlToWhichToAdd,paneltodisplayastoltip)
而不是将字符串作为第二个参数传递)

如果这不可能,我猜下一个最好的方法是在控件上的
mouse\u enter
事件的鼠标位置上显示一个面板,然后在
mouse\u leave
上删除它(或使它不可见)


或者有其他更简单的方法来实现这一点吗?

您可以为编写一个处理程序,然后取消弹出窗口以显示您自己的面板。 不过,你需要在适当的时候把它清理干净

例如:

private void ToolTip1_Popup(Object sender, PopupEventArgs e)
{
  e.Cancel = true;
  //Do work here to display whatever control you'd like
}
如果您只是在工具提示显示中查找更多格式选项,另一种方法是,实现启用HTML的工具提示:


这是不可能开箱即用的。你有两个选择。第一个选项是覆盖,这将允许您自定义工具提示的外观。这是。如果使用此方法,请确保将属性设置为
true

虽然如果您只需要一些简单的定制,第一种方法就可以工作,但是如果您需要更灵活的选项,第二种方法将最有效。第二个选项是按照您已经建议的方法,创建自己的工具提示。简单地说,您将首先为创建一个事件处理程序。当该事件激发时,您将启用。此计时器是显示工具提示之前发生的延迟。最后,您只需在鼠标坐标处显示面板

假设您有一个带有按钮和计时器的窗体,并且希望该按钮具有作为面板的工具提示:

public partial class Form1 : Form
{
    private Panel _myToolTipPanel;

    private void Form1_Load(object sender, EventArgs e)
    {
        _myToolTipPanel = new Panel {Visible = false};
        Controls.Add(_myToolTipPanel);

        Label myLabel = new Label();
        myLabel.Text = "Testing";
        _myToolTipPanel.Controls.Add(myLabel);
    }

    private void button1_MouseEnter(object sender, EventArgs e)
    {
        timer1.Enabled = true;
    }

    private void button1_MouseLeave(object sender, EventArgs e)
    {
        timer1.Enabled = false;
        _myToolTipPanel.Visible = false;
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Enabled = false;
        Point position = Cursor.Position;
        Point formPoisition = PointToClient(position);

        _myToolTipPanel.Visible = true;
        _myToolTipPanel.Location = formPoisition;
    }
}

当然,现在你必须对工具提示进行一些美化,但这是一般的想法

一种方法可以是继承工具提示控件,然后覆盖SetToolTip和Show方法。在SetToolTip内部,需要重新编写私有方法-SetToolTipInternal,但大部分功能可以重用-它使用鼠标事件(离开、移动)绑定区域。但是,由于工具提示使用内部窗口来显示阳台窗口。您必须重写相当多的代码


但这可能会很耗时,需要进行大量测试。

在WPF中,这很简单,因为您可以使用完全可自定义的弹出控件。您为MouseEnter和MouseLeave添加处理程序的想法很好,我认为没有更简单的方法。这种机制非常普遍地用于Web应用程序(使用javascript)。如果您想要一种标准的方式,我认为您应该搜索ToolStripControlHost或Goolge以获得“C#中的自定义工具提示”。有很多结果。但是,它们中的大多数使用ToolStripControlHost如果您想要您自己的SetToolTip方法,该方法具有您提到的第二个参数,只需创建从.NET ToolTip继承的自定义ToolTip即可。