2011-01-11 10 views
5

Mam dynamicznie wypełnione ContextMenuStrip, gdzie każdy ToolStripMenuItem ma sformatowany tekst etykiety narzędzi. Aby tekst ten miał sens dla użytkownika, muszę użyć czcionki o stałej szerokości, np. "Courier New". Domyślna czcionka to zwykła czcionka bez Monospacingu. Nie mogłem znaleźć żadnego obiektu narzędziowego ToolTip ani sposobu na przesłonięcie jego zdarzenia Draw ani sposobu na ustawienie jego stylu.Czy można zmienić czcionkę narzędzia ToolStripMenuItem?

Czy jest więc możliwa zmiana czcionki narzędzia ToolStripMenuItem?

Implementacja CustomToolTip, który dziedziczy z ToolTip, nie rozwiązuje problemu, który przekazuje nową etykietkę narzędzi ToolStripMenuItem.

+0

Podejrzewam, być może trzeba będzie użyć jednego z wielu elementów tooltip trzecich takich jak http://www.telerik.com – Lazarus

+0

Niestety, nie mogę użyć dowolnego elementu strony trzeciej. – ElyaSh

+0

Coś tu nie ma sensu. Tagujesz pytanie WPF, ale mówisz o kontrolce 'ToolStripMenuItem'. To jest kontrola WinForm. Którego używasz? Podejrzewam, że to robi ogromną różnicę. –

Odpowiedz

2

Można utworzyć niestandardową klasę ToolTip (CustomToolTip), która dziedziczy z ToolTip. Wtedy musiałbyś obsłużyć zdarzenie OnDraw. Wewnątrz tego wydarzenia możesz zmienić czcionkę.

Look here dla przykładu (jest przykład vb i C#).

EDIT

Trzeba by obsłużyć renderowania niestandardowego podpowiedzi na własnym (tj OnMouseOver, OnMouseLeave wydarzenia z toolstripmenuitem). Być może uda Ci się utworzyć niestandardowetoolstripmenuitem, które używa niestandardowej podpowiedzi, ale nie jestem pewien, czy toolstripmenuitem ujawnia propetykę/obiekt narzędzia.

+0

Problem nie polega na dziedziczeniu z ToolTip, ale z dostarczeniem go do ToolStripMenuItem. – ElyaSh

+0

Będziesz musiał obsłużyć renderowanie niestandardowej podpowiedzi na własną rękę (zdarzenia IE: OnMouseOver, OnMouseLeave z toolstripmenuitem). Być może uda Ci się utworzyć niestandardowetoolstripmenuitem, które używa niestandardowej podpowiedzi, ale nie jestem pewien, czy toolstripmenuitem ujawnia propetykę/obiekt narzędzia. –

+0

toolstripmenuitem nie wystawiając proptoc/obiektu obiektu jest głównym powodem, dla którego zdecydowałem się zadać pytanie tutaj. – ElyaSh

10

OK dzięki Tony Abrams i William Andrus roztwór w następujący sposób:

  • statyczne wystąpienie ToolTip których zainicjowana.

    toolTip = new ToolTip(); 
    toolTip.OwnerDraw = true; 
    toolTip.Draw += new DrawToolTipEventHandler(tooltip_Draw); 
    toolTip.Popup += new PopupEventHandler(tooltip_Popup);  
    toolTip.UseAnimation = true; 
    toolTip.AutoPopDelay = 500; 
    toolTip.AutomaticDelay = 500; 
    
  • Przywołanie zdarzenia ToolTip w celu ustawienia jego rozmiaru.

    void tooltip_Popup(object sender, PopupEventArgs e) 
    { 
        e.ToolTipSize = TextRenderer.MeasureText(toolTipText, new Font("Courier New", 10.0f, FontStyle.Bold)); 
        e.ToolTipSize = new Size(e.ToolTipSize.Width + TOOLTIP_XOFFSET, e.ToolTipSize.Height + TOOLTIP_YOFFSET); 
    } 
    
  • Zdarzenie losowania narzędzia dla rzeczywistego rysunku.

    void tooltip_Draw(object sender, DrawToolTipEventArgs e) 
    { 
    Rectangle bounds = e.Bounds; 
    bounds.Offset(TOOLTIP_XOFFSET, TOOLTIP_YOFFSET); 
    DrawToolTipEventArgs newArgs = new DrawToolTipEventArgs(e.Graphics, e.AssociatedWindow, e.AssociatedControl, bounds, e.ToolTipText, toolTip.BackColor, toolTip.ForeColor, new Font("Courier New", 10.0f, FontStyle.Bold)); 
        newArgs.DrawBackground(); 
        newArgs.DrawBorder(); 
        newArgs.DrawText(TextFormatFlags.TextBoxControl); 
    } 
    
  • Zdarzenie MouseEnter ToolStripMenuItem w celu wyświetlenia etykiety narzędzia.

    System.Windows.Forms.ToolStripMenuItem item = (sender as System.Windows.Forms.ToolStripMenuItem); 
    toolTip.Show("ToolTipText", item.Owner); 
    
  • wydarzenie ToolStripMenuItem za mouseLeave aby ukryć podpowiedź.

    System.Windows.Forms.ToolStripMenuItem item = (sender as System.Windows.Forms.ToolStripMenuItem); 
    toolTip.Hide(item.Owner); 
    
+1

+1 Dziękujemy za wysłanie ostatecznego rozwiązania! W ten sposób, jeśli ktoś inny przybędzie tutaj z tym samym pytaniem, będzie wiedział, jak to rozwiązałeś. Również sformatowałem kod dla ciebie. Sztuczka polegająca na tym, że formatowanie działa w punktach, to wcięcie ośmiu spacji, zamiast zwykłego 4. –

+0

Szukałem rozwiązania dla nieco pokrewnego problemu: wyświetlanie etykiety z niestandardowym tekstem na niektórych przyciskach paska narzędzi, ale nie na wszystkich. Nie potrzebował niestandardowego rysunku, ale wyłączanie wbudowanych etykiet narzędzi paska narzędzi oraz obsługa MouseEnter i MouseLeave ToolStripMenuItem, aby pokazać tekst etykiety elementu, który nie był pusty lub pusty, działał świetnie. – neminem

+0

Sprawdziło się doskonale, chociaż w niektórych sytuacjach otrzymałem dodatkową (pustą) etykietkę narzędziową, wydawało mi się, że wtedy moje okno zmieniło kontrolę przycisków, które używały podpowiedzi). Aby rozwiązać ten problem, upewniłem się, że mój MouseLeave usunął etykietkę i ponownie utworzył etykietkę w aplikacji MouseHover. Oczywiście potrzebne było odniesienie poza oboma słuchaczami, aby to zadziałało. –

0

Wiem, że jestem trochę późno na imprezę na ten jeden, ale można użyć refleksji ustawić instancję ToolTip, który jest używany do renderowania podpowiedzi. Po wykonaniu tej czynności możesz po prostu użyć metody Draw tak jak zwykle.

public void SetToolTipInstance(ToolStrip ts, ToolTip tt) 
{ 
    Type type = ts.GetType.BaseType; 
    int propToolTip = Convert.ToInt32(type.GetField("PropToolTip", BindingFlags.NonPublic | BindingFlags.Static).GetValue(ts)); 
    dynamic ps = type.BaseType.GetProperty("Properties", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ts); 
    ps.GetType.GetMethod("SetObject", BindingFlags.Instance | BindingFlags.Public).Invoke(ps, {propToolTip,tt}); 
} 
Powiązane problemy