Jak dodać etykietkę narzędzia do kontrolki?

154

Mam pewne elementy sterujące, które chciałbym wyświetlić, ToolTipgdy kursor myszy znajduje się nad nim. W jaki sposób mogę to zrobić? Chciałbym wiedzieć, jak to zrobić poprawnie w kodzie, ale także w projektancie ( ToolTipw przyborniku jest komponent, ale nie całkiem… rozumiem).

Nie zdziwiłbym się, gdyby to był duplikat, ale mogę znaleźć tylko pytania dotyczące bardziej zaawansowanych, szczegółowych scenariuszy. Chciałbym poznać podstawy.

Svish
źródło
Powiązane i starsze (ogólnie dotyczy .NET): stackoverflow.com/questions/168550/…
Christopher Kyle Horton

Odpowiedzi:

208

Oto Twój artykuł dotyczący robienia tego z kodem

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
źródło
3
Więc chyba nie ma znaczenia, czy toolTip1zmienna wykracza poza zakres?
Svish
1
A co z jednym statycznym ToolTipdla wszystkich twoich formularzy?
Svish
7
Zostanie zwolniony, gdy przestanie istnieć odniesienie, co by nie było, ponieważ przycisk i pole wyboru nadal będą się do niego odwoływać
Rowland Shaw
2
Odwołują się do niego, ponieważ „SetToolTip” dodaje EventHandlers do zdarzeń przycisku i pola wyboru
Eduardo Wada
3
Myślę, że umieszczenie podpowiedzi w zmiennej statycznej to zły pomysł. Co się stanie, jeśli formularz zostanie zamknięty i ponownie otwarty? Czy SetTooltip znowu będzie działać? A jeśli tak, to czy programy obsługi formularza zamkniętego pozostaną w pamięci lub zostaną poprawnie usunięte? Nie spędziłbym nawet minuty na testowaniu tego. Zamiast tego użyj zmiennej członkowskiej - to jest kuloodporne!
Elmue,
138

Przeciągnij kontrolkę podpowiedzi z przybornika do formularza. Tak naprawdę nie musisz nadawać mu żadnych właściwości poza nazwą. Następnie we właściwościach kontrolki, dla której chcesz mieć podpowiedź, poszukaj nowej właściwości z nazwą właśnie dodanej kontrolki podpowiedzi. Domyślnie wyświetli podpowiedź, gdy kursor znajdzie się na kontrolce.

JYelton
źródło
54
Upewnij się, że podczas wykonywania tej czynności (np. O 2 w nocy) używasz kontrolki ToolTip, a nie kontrolki ToolStrip.
Adrian K
2
W przypadku tej odpowiedzi dodanie tylko jednej podpowiedzi do winform daje wszystkim kontrolkom w formularzu własną podpowiedź.
Sob
Potężny w swojej prostocie, po prostu upewnij się, że upuścisz go na odpowiednią kontrolkę, a nie na tę obok (jak o 2 w nocy).
Michael Stimson
40
  1. Dodaj składnik ToolTip do formularza
  2. Wybierz jedną z kontrolek, dla których chcesz uzyskać podpowiedź
  3. Otwórz siatkę właściwości ( F4), na liście znajdziesz właściwość o nazwie „ToolTip on toolTip1” (lub coś podobnego). Ustaw żądany tekst podpowiedzi dla tej właściwości.
  4. Powtórz 2-3 dla pozostałych elementów sterujących
  5. Gotowe.

Sztuczka polega na tym, że formant ToolTip jest kontrolką rozszerzającą , co oznacza, że ​​rozszerzy zestaw właściwości dla innych kontrolek w formularzu. Za kulisami osiąga się to poprzez generowanie kodu, jak w odpowiedzi Svetlozar. Istnieją inne kontrolki działające w ten sam sposób (na przykład HelpProvider).

Fredrik Mörk
źródło
1
Więc możesz użyć tej samej etykiety narzędzi dla wielu kontrolek z różnymi tekstami?
Svish
@Svish: tak, taki jest cel kontroli rozszerzenia.
Fredrik Mörk
Czy można go również używać między kontrolkami użytkowników i formularzami? Podobnie jak w przypadku utworzenia statycznej etykiety narzędzi ze standardowymi wartościami właściwości. A może byłoby to uznane za złą praktykę?
Svish
Nigdy tego nie próbowałem i nie do końca znam wewnętrzne działanie ToolTip, ale ponieważ otrzymuje odniesienie do kontrolki, z którą powiązany jest tekst, myślę, że może działać. Tylko jeden sposób, aby się dowiedzieć; spróbuj: o)
Fredrik Mörk
Cóż, oczywiście spróbuję. Ale nie jestem szczególnie dobry w znajdowaniu takich rzeczy, jak wycieki pamięci i tym podobne ... A jeśli to spowodowałoby wyciek pamięci lub coś podobnego, chciałbym wiedzieć, hehe.
Svish
8

Etykietka narzędzi w języku C # jest bardzo łatwa do dodania do prawie wszystkich kontrolek interfejsu użytkownika. W tym celu nie musisz dodawać żadnego zdarzenia MouseHover.

Oto jak to zrobić-

  1. Dodaj obiekt ToolTip do formularza. Na całą formę wystarczy jeden przedmiot. ToolTip toolTip = new ToolTip();

  2. Dodaj kontrolkę do etykiety narzędzi z żądanym tekstem.

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

OopsDev
źródło
1

Zrobiłem to w ten sposób: po prostu dodaj zdarzenie do dowolnej kontrolki, ustaw znacznik kontrolki i dodaj warunek, aby obsłużyć etykietkę dla odpowiedniej kontrolki / tagu.

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
źródło
-3

Po prostu zasubskrybuj zdarzenie ToolTipTextNeeded kontrolki i zwróć e.TooltipText, znacznie prostsze.

fredv
źródło
6
Nie sądzę, że jest to standardowe zdarzenie kontrolne WinForm.
Dan7,