图片框工具提示更改 C#

28

好的,我是一名完全的初学者,并且成功地用C#编写了一个小应用程序,在文本框中输入用户名后,应用程序会获取该用户名的头像并在图片框中显示出来。

我想要做的是,当鼠标悬停在加载的头像上时,显示输入到文本框中的用户名。每次加载新的头像时,它都应该更改。我知道如何正常使用工具提示,但这对我来说有点复杂。任何帮助将不胜感激。

谢谢。

4个回答

47

使用以下代码为您的picturebox添加hover事件。

private void pictureBox1_MouseHover(object sender, EventArgs e)
{
    ToolTip tt = new ToolTip();
    tt.SetToolTip(this.pictureBox1, "Your username");
}

它完美地运行了!我只是用textBox1.Text替换了“Your username” :D 谢谢! - BrandNewDev
4
很高兴听到这个消息,这是让你想知道的事情之一,为什么微软没有为图片框控件创建一个名为工具提示的属性...我起初也花了一段时间才弄明白。 - Joe
它能够工作,但我有多个提示框重叠显示的问题。作为一种替代方案,我们可以有一个全局的ToolTip对象,然后在每次悬停事件时使用 ToolTip.Show() 而不是创建一个新的提示框...? 另请参阅 此答案 - Amos Egel

24

Joes的答案确实可以完成任务,但它效率低下。每次将鼠标悬停在PictureBox上时,代码都会创建一个新的ToolTip。当你使用SetToolTip()方法时,它将创建的ToolTip与指定的控件相关联并将其保留在内存中。你只需要调用一次这个方法。我建议你在窗体构造函数中为每个PictureBox创建一个ToolTip。我已经测试过了,它可以正常工作,并且对我来说工具提示显示得更快:

public MyForm()
{
    InitializeComponent();

    // The ToolTip for the PictureBox.
    new ToolTip().SetToolTip(pictureBox1, "The desired tool-tip text.");
}

但是这种方法是否允许根据用户输入动态更改工具提示文本,就像原帖中所要求的那样? - Amos Egel

6
Brandon-Miller的回答很好,但是他建议为每个PictureBox创建一个Tooltip。尽管这比Joe的方法更好,但这仍然是低效的 - 因为你实际上不需要多个Tooltip对象来处理整个窗体!它可以为不同的控件(表单上的各种元素)创建数千个“工具提示定义”(可能不是一个实际术语)。这就是为什么在创建或设置Tooltip时,将控件定义为第一个参数。
正确的(或者至少是最节约的)方法,据我所知,是为每个表单创建一个Tooltip对象,然后使用SetTooltip函数为不同的控件创建“定义”。
例如:
private ToolTip helperTip;
public MyForm()
{
    InitializeComponent();

    // The ToolTip initialization. Do this only once.
    helperTip = new ToolTip(pictureBox1, "Tooltip text");
    // Now you can create other 'definitions', still using the same tooltip! 
    helperTip.SetToolTip(loginTextBox, "Login textbox tooltip");
}

或者稍微不同,事先完成初始化:

// Instantiate a new ToolTip object. You only need one of these! And if
// you've added it through the designer (and renamed it there), 
// you don't even need to do this declaration and creation bit!
private ToolTip helperTip = new ToolTip();
public MyForm()
{
    InitializeComponent();

    // The ToolTip setting. You can do this as many times as you want
    helperTip.SetToolTip(pictureBox1, "Tooltip text");
    // Now you can create other 'definitions', still using the same tooltip! 
    helperTip.SetToolTip(loginTextBox, "Login textbox tooltip");
}

如果您在表单设计器中添加了工具提示,可以省略开头的声明。您甚至不需要初始化它(据我所知,这应该由设计器生成的代码完成),只需使用SetToolTip为不同的控件创建新的工具提示即可。

+1 这是最好的答案。在设计师中,您应该能够将控件与工具提示和所需的工具提示文本关联起来,而无需编写任何代码,或者至少据我所知(自从我使用Windows Forms以来已经有一段时间了)。 - Brandon Miller
但是这种方法是否允许具有动态工具提示文本,该文本取决于用户输入,就像原始帖子中所要求的那样? - Amos Egel

1
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        ToolTip tooltip1 = new ToolTip();
        tooltip1.Show(textBox1.Text, this.pictureBox1);
    }

      private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        pictureBox1.Invalidate();
    }

我只是在想...为什么每次鼠标移动到图片框上时都会使其无效?在典型情况下,我们可能会使图片框在一秒钟内多次无效...所有这些都是为了更新工具提示。这种极度低效是一个严重的非启动因素。 - Alex Essilfie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接