2012-04-02 12 views
2

Gibt es eine einfache Möglichkeit, den Abstand zwischen dem Menüelementtext und seiner Tastenkombination in einem WinForms-MenüStrip zu erhöhen? Wie unten zu sehen, auch die Standardvorlage von VS erzeugt sieht schlecht aus, mit der Text „Druckvorschau“ über die Shortcut-Tasten anderer Elemente erstrecken:Shortcut-Tastenabstand für MenuStrip

MenuStrip

ich nach einem Weg suchen, um etwas Abstand haben zwischen dem längsten Menüpunkt und dem Beginn des Tastaturkürzels.

Antwort

2

Eine einfache Möglichkeit ist, die kürzeren Menüpunkte zu entfernen. Zum Beispiel Pad die Text-Eigenschaft des „Neu“ Menüpunkt „New                              “ zu sein, so dass es alle zusätzlichen Leerzeichen am Ende hat und das wird umwerfen Die Abkürzung.

aktualisieren

Ich schlug vor, dies um Ihnen zu helfen in Code zu automatisieren. Hier ist das Ergebnis der Vermietung den Code die Arbeit für Sie:

enter image description here

Ich schrieb den folgenden Code, den Sie, dass die Hauptmenüpunkte durch alle unter der Menüleiste gehen aufrufen können und die Größe, die alle Menüpunkte :

// put in your ctor or OnLoad 
// Note: the actual name of your MenuStrip may be different than mine 
// go through each of the main menu items 
foreach (var item in menuStrip1.Items) 
{ 
    if (item is ToolStripMenuItem) 
    { 
     ToolStripMenuItem menuItem = (ToolStripMenuItem)item; 
     ResizeMenuItems(menuItem.DropDownItems); 
    } 
} 

Und das sind die Methoden, die die Arbeit machen:

private void ResizeMenuItems(ToolStripItemCollection items) 
{ 
    // find the menu item that has the longest width 
    int max = 0; 
    foreach (var item in items) 
    { 
     // only look at menu items and ignore seperators, etc. 
     if (item is ToolStripMenuItem) 
     { 
      ToolStripMenuItem menuItem = (ToolStripMenuItem)item; 
      // get the size of the menu item text 
      Size sz = TextRenderer.MeasureText(menuItem.Text, menuItem.Font); 
      // keep the longest string 
      max = sz.Width > max ? sz.Width : max; 
     } 
    } 

    // go through the menu items and make them about the same length 
    foreach (var item in items) 
    { 
     if (item is ToolStripMenuItem) 
     { 
      ToolStripMenuItem menuItem = (ToolStripMenuItem)item; 
      menuItem.Text = PadStringToLength(menuItem.Text, menuItem.Font, max); 
     } 
    } 
} 

private string PadStringToLength(string source, Font font, int width) 
{ 
    // keep padding the right with spaces until we reach the proper length 
    string newText = source; 
    while (TextRenderer.MeasureText(newText, font).Width < width) 
    { 
     newText = newText.PadRight(newText.Length + 1); 
    } 
    return newText; 
} 
+0

mit dieser Das Problem ist, dass es schwierig ist requ die Anzahl der Räume, um zu bestimmen in einer Schriftart ohne feste Breite - es ist nicht so einfach wie die Länge der Zeichenfolge. +1 trotzdem. – casablanca

+0

Werfen Sie einen Blick auf mein Update, @casablanca. –

+0

Danke, ich akzeptiere diese Antwort - ich wollte wirklich nicht mit 'MeasureText' enden, aber ich konnte keinen besseren Weg finden. – casablanca

Verwandte Themen