Como adiciono uma dica de ferramenta a um controle?

154

Eu tenho alguns controles que gostaria de exibir ToolTippara quando o mouse estiver passando o mouse sobre ele. Como posso fazer isso? Gostaria de saber como fazer isso corretamente no código, mas também no designer (há um ToolTipcomponente na caixa de ferramentas, mas não entendo bem ..).

Eu não ficaria surpreso se isso for uma duplicata, mas só consigo encontrar perguntas em cenários específicos mais avançados. Eu gostaria de saber o básico.

Svish
fonte
Possível duplicado da Exibindo dica no foco do mouse de um texto
Jim caiu
Relacionados e mais antigos ainda (se aplica ao .NET em geral): stackoverflow.com/questions/168550/…
Christopher Kyle Horton

Respostas:

208

Aqui está o seu artigo para fazê-lo com código

private void Form1_Load(object sender, System.EventArgs e)
{
     // Create the ToolTip and associate with the Form container.
     ToolTip toolTip1 = new ToolTip();

     // Set up the delays for the ToolTip.
     toolTip1.AutoPopDelay = 5000;
     toolTip1.InitialDelay = 1000;
     toolTip1.ReshowDelay = 500;
     // Force the ToolTip text to be displayed whether or not the form is active.
     toolTip1.ShowAlways = true;

     // Set up the ToolTip text for the Button and Checkbox.
     toolTip1.SetToolTip(this.button1, "My button1");
     toolTip1.SetToolTip(this.checkBox1, "My checkBox1");
}
Svetlozar Angelov
fonte
3
Então eu acho que não importa se a toolTip1variável sai do escopo?
Svish
1
Que tal uma estática ToolTippara todos os seus formulários?
Svish
7
Ele seria libertado uma vez que ficou sem referência, o que não seria, como o botão e caixa de seleção ainda referência a ela
Rowland Shaw
2
Eles estão fazendo referência a ele porque "SetToolTip", acrescenta EventHandlers para o botão e eventos do checkbox
Eduardo Wada
3
Eu acho que é uma má idéia colocar a dica de ferramenta em uma variável estática. E se um formulário for fechado e aberto novamente? A SetTooltip funcionará novamente? E se sim, os manipuladores do formulário fechado permanecerão na memória ou serão removidos corretamente? Eu nem gastaria um minuto testando isso. Em vez disso, use uma variável de membro - isso é à prova de balas!
Elmue
138

Arraste um controle de dica de ferramenta da caixa de ferramentas para seu formulário. Você realmente não precisa fornecer outras propriedades além de um nome. Em seguida, nas propriedades do controle em que você deseja ter uma dica de ferramenta, procure uma nova propriedade com o nome do controle da dica de ferramenta que você acabou de adicionar. Por padrão, ele fornece uma dica de ferramenta quando o cursor passa o controle.

JYelton
fonte
54
Certifique-se de que, ao fazer isso (como às 2h), use um controle ToolTip e não um controle ToolStrip.
Adrian K
2
Com esta resposta, adicionar apenas uma dica de ferramenta ao winform fornece a todos os controles no formulário sua própria dica de ferramenta.
SAm
Poderoso em sua simplicidade, certifique-se de deixá-lo no controle certo e não no próximo (como às 2 da manhã).
Michael Stimson
40
  1. Adicione um componente de dica de ferramenta ao seu formulário
  2. Selecione um dos controles para os quais deseja obter uma dica de ferramenta
  3. Abra a propriedade grid ( F4), na lista você encontrará uma propriedade chamada "ToolTip on toolTip1" (ou algo semelhante). Defina o texto da dica de ferramenta desejada nessa propriedade.
  4. Repita 2-3 para os outros controles
  5. Feito.

O truque aqui é que o controle ToolTip é um controle extensor , o que significa que ele estenderá o conjunto de propriedades para outros controles no formulário. Nos bastidores, isso é alcançado gerando código como na resposta de Svetlozar. Existem outros controles funcionando da mesma maneira (como o HelpProvider).

Fredrik Mörk
fonte
1
Então você pode usar a mesma dica de ferramenta para muitos controles com textos diferentes?
Svish
@Ishish: sim, esse é o objetivo dos controles extensores.
Fredrik Mörk
Também pode ser usado entre controles de usuário e formulários? Como se você tivesse criado uma dica de ferramenta estática com seus valores de propriedade padrão. Ou isso seria considerado uma má prática?
Svish
Nunca tentei e não conheço muito bem o funcionamento interno da dica de ferramenta, mas como ela obtém uma referência ao controle ao qual um texto está relacionado, acho que poderia funcionar. Só há uma maneira de descobrir; experimentá-lo: o)
Fredrik Mörk
Bem, obviamente vou experimentar. Mas eu não sou especialmente bom em encontrar coisas como vazamentos de memória e coisas assim ... E se isso causasse um vazamento de memória ou algo assim, eu gostaria de saber, hehe.
Svish
8

A dica de ferramenta em C # é muito fácil de adicionar a quase todos os controles da interface do usuário. Você não precisa adicionar nenhum evento MouseHover para isso.

É assim que se faz

  1. Adicione um objeto de dica de ferramenta ao seu formulário. Um objeto é suficiente para todo o formulário. ToolTip toolTip = new ToolTip();

  2. Adicione o controle à dica de ferramenta com o texto desejado.

    toolTip.SetToolTip(Button1,"Click here");

OopsDev
fonte
1

Fiz da seguinte maneira: basta adicionar o evento a qualquer controle, definir a marca do controle e adicionar um condicional para manipular a dica de ferramenta do controle / marca apropriado.

private void Info_MouseHover(object sender, EventArgs e)
{
    Control senderObject = sender as Control;
    string hoveredControl = senderObject.Tag.ToString();

    // only instantiate a tooltip if the control's tag contains data
    if (hoveredControl != "")
    {
        ToolTip info = new ToolTip
        {
            AutomaticDelay = 500
        };

        string tooltipMessage = string.Empty;

        // add all conditionals here to modify message based on the tag 
        // of the hovered control
        if (hoveredControl == "save button")
        {
            tooltipMessage = "This button will save stuff.";
        }

        info.SetToolTip(senderObject, tooltipMessage);
    }
}
log-cab.in
fonte
-3

Basta se inscrever no evento ToolTipTextNeeded do controle e retornar e.TooltipText, muito mais simples.

fredv
fonte
6
Eu não acho que esse seja um evento de controle padrão do WinForm.
Dan7