2015-08-31 10 views
8

Ist es möglich, die Rahmenfarbe einer Dropdown-Menüleiste des Werkzeugleistenmenüs zu ändern?Ändern der Rahmenfarbe der Winforms-Menü-Dropdown-Liste

In meinem Beispiel unten möchte ich, dass das Dropdown-Menü eine Farbe (blau) hat, ohne dass der weiße Rahmen angezeigt wird, aber das Hauptmenü ("Mein Menü") weiß bleibt.

Irgendwelche Ideen?

enter image description here

+0

Sind Sie für diese Frage sah: http://stackoverflow.com/questions/13235627/how-to-change-the-appearance-of-a-menustrip? –

+0

Hmm, es könnte ein Duplikat sein. Aber ich weiß immer noch nicht, welche Eigenschaft überschrieben werden soll, um den gewünschten Effekt zu erzielen. Ich habe MenuItemBorder und MenuBorder ausprobiert, aber es ändert sich nicht. –

+1

Um die Rahmenfarbe zu ändern, genügt es, der @Plutonix-Lösung zu folgen, die in der akzeptierten Antwort beschrieben wird. Um diesen weißen Rahmen zwischen dem Objekt und der Menüleiste zu entfernen, sollten Sie jedoch eine der Lösungen, die ich beschrieben habe, befolgen. –

Antwort

10

Is it possible to change the border color of a toolstrip menu dropdown list.

Ja. Eine Klasse, die von ProfessionalColorTable Werke erbt wie erwartet:

class MenuColorTable : ProfessionalColorTable 
{ 
    public MenuColorTable() 
    { 
     // see notes 
     base.UseSystemColors = false; 
    } 
    public override System.Drawing.Color MenuBorder 
    { 
     get{return Color.Fuchsia;} 
    } 
    public override System.Drawing.Color MenuItemBorder 
    { 
     get{return Color.DarkViolet;} 
    } 
    public override Color MenuItemSelected 
    { 
     get { return Color.Cornsilk;} 
    } 
    public override Color MenuItemSelectedGradientBegin 
    { 
     get{return Color.LawnGreen;} 
    } 
    public override Color MenuItemSelectedGradientEnd 
    { 
     get { return Color.MediumSeaGreen; } 
    } 
    public override Color MenuStripGradientBegin 
    { 
     get { return Color.AliceBlue; } 
    } 
    public override Color MenuStripGradientEnd 
    { 
     get { return Color.DodgerBlue; } 
    } 
} 

In Form Last:

menuStrip1.Renderer = new ToolStripProfessionalRenderer(new MenuColorTable()); 

Wenn visuelle Stile nicht eingeschaltet sind, werden nicht alle Farbtabelle Elemente verwendet werden und einige SystemColors wird stattdessen verwendet. Sie aktivieren die visuelle Stile in Main():

// must be done before any UI elements are used 
Application.EnableVisualStyles(); 

Sie können auch deaktivieren Systemfarben wollen, wie sie in der Ctor gezeigt. Der Standardwert sollte false sein, unabhängig davon, ob visuelle Stile aktiviert sind oder nicht, aber vielleicht hat etwas anderes sie geändert?

base.UseSystemColors = false; 

Beide EnableVisualStyles() und UseSystemColors = false; haben für alle die Rendering-Elemente in der Farbtabelle vorhanden sein, umgesetzt werden, sonst nur einige verwendet werden. (Obwohl, MenuBorder scheint egal zu arbeiten, was.) Ansonsten sind die Ergebnisse wie erwartet:

enter image description here

Das Menü Gradient von Aliceblue zu DodgerBlue geht; ein Element mit der Maus darüber verwendet einen von oben nach unten Gradienten von LawnGreen zu MediumSeaGreen (Maus nicht gezeigt).

enter image description here

Wenn geöffnet, ist die Menüleiste Fuschia (mmmm, beruhigenden!)

enter image description here

Mit der Maus über eines der Elemente (Maus nicht dargestellt), das Element der verwendet MenuItemSelected Farbe, die Consilk war.

Wenn Sie Probleme haben, Ihre Überschreibungen zum Laufen zu bringen, überprüfen Sie, ob Sie die richtigen verwenden (oder dass sie meinen, was der Name bedeutet, einige sind auf den ersten Blick irreführend).

Sie können auch überprüfen, ob Sie eine MenuStrip für das Menü verwenden, Net hat eine andere (ältere) Menü-Klasse, obwohl Sie suchen müssen, um es zu finden. Sie können auch ein beliebiges Design ändern oder deaktivieren, um zu sehen, ob dies nachteilige Auswirkungen hat.

+0

Danke - das ist eine gute Antwort. Irgendeine Idee, was die Methode ist, um zu überschreiben, um die Schriftfarbe des ausgewählten Menüelements (oberes Menü, nicht Dropdown) zu ändern? –

+0

Ist das nicht eine Standardeigenschaft? 'menuStrip1.BackColor' scheint nur den Top/Main-Menütext zu ändern. Es gibt auch MouseEnter/MouseLeave-Ereignisse, wenn Sie eine Änderung an den Glow-Effekt anpassen möchten. Das könnte aber langweilig sein – Plutonix

0

Ich kann die Demo-Anwendung jetzt machen, aber Screenshots in diesem Artikel http://www.vbforums.com/showthread.php?596563-100-Customizable-MenuStrip-ToolStrip-StatusStrip-including-common-presets uns beweist, dass der Grenzfarbwechsel möglich ist.

Dieser Typ hat eine Bibliothek entwickelt, aber es basiert auf Standard-ToolStrip-Implementierung.

Ich hoffe, dass dieser Link hilfreich sein wird.

+0

Tx, nicht sicher, ob ich etwas verpasse, aber die Ränder in diesen Screenshots sind immer noch weiß (für das Dropdown-Menü). –

+0

Dieses Fenster: http://i48.tinypic.com/2mzjfva.jpg hat einen dunkelroten Rand. Ein zusätzlicher weißer Rand wird durch den Hintergrund verursacht. –

+0

Es sind die extra weißen Ränder, auf die ich mich beziehe. Auf meinem Screenshot habe ich auch den Hintergrund in einer anderen Farbe (gemäß dem Screenshot). Aber beide haben diese kleine lustige weiße Grenze. –

0

Sie können den Elementen negative Ränder geben, um die Grenze zu verdecken.

6

Um die Rahmenfarbe zu ändern, genügt es, der Plutonix-Lösung zu folgen, die in der akzeptierten Antwort beschrieben wird. Aber das weiß Grenze zwischen dem Element und Menüleiste zu entfernen, sollten Sie eine dieser Lösung folgen:

Lösung 1


Sie es Ihre eigene Farbtabelle, tun können durch die Implementierung, die ProfessionalColorTable und überwiegendes erbt korrekte Eigenschaften. Gehen Sie nach den folgenden Schritten:

Schritte

  1. Setzen Sie ein Toolstrip auf dem Formular, und fügen Sie Dropdownbutton und seine Unterelemente hinzu und Set ForeColor von Unterpunkten auf Weiß.
  2. erstellen CustomColorTable Klasse Vererben von ProfessionalColorTable
  3. Aufschalten ImageMarginGradientBegin, ImageMarginGradientMiddle, ImageMarginGradientEnd, ToolStripDropDownBackground und gibt die Farbe, die Sie (blau) wollen .ab
  4. In Ihrem Form Load-Ereignis gesetzt Renderer Eigenschaft ToolStripManager ein Toolstripprofessionalrenderer zu verwenden, die verwendet Ihre CustomColorTable.

CustomColorTable-Code

public class CustomColorTable:ProfessionalColorTable 
{ 
    public override Color ImageMarginGradientBegin 
    { 
     get 
     { 
      return Color.MidnightBlue; 
     } 
    } 

    public override Color ImageMarginGradientMiddle 
    { 
     get 
     { 
      return Color.MidnightBlue; 
     } 
    } 

    public override Color ImageMarginGradientEnd 
    { 
     get 
     { 
      return Color.MidnightBlue; 
     } 
    } 

    public override Color ToolStripDropDownBackground 
    { 
     get 
     { 
      return Color.MidnightBlue; 
     } 
    } 
} 

Form Load-Code

private void Form_Load(object sender, EventArgs e) 
{ 
    ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable()); 
} 

Screenshot

Hier normalen Screenshot

enter image description here

Und hier ist ein 2x vergrößert Screenshot:

enter image description here

Lösung 2


Es gibt auch eine alternative Lösung, wenn Sie nicht wollen, anwendbar ist, um Bilder in Ihren Menüpunkten zu verwenden. Suchen Sie in diesem Fall die DropDown-Eigenschaft Ihrer Dropdown-Schaltfläche, und wandeln Sie sie in ToolStripDropDownMenu um. Legen Sie dann die ShowImageMargin-Eigenschaft auf false und BackColor auf die gewünschte Farbe (blau) fest.

private void Form_Load(object sender, EventArgs e) 
{ 
    //The item with text "My Menu" in your sample 
    var dropDownMenu = (ToolStripDropDownMenu)this.myMenuToolStripDropDownButton1.DropDown; 
    dropDownMenu.ShowImageMargin = false; 
    dropDownMenu.BackColor = Color.Navy; 
} 

enter image description here

+0

Danke für die Antwort. Es ist auch eine gute Antwort, aber ich habe zuerst die Antwort unten gesehen und diese ganze Implementierung gemacht. Leider kann ich nur 1 Antwort akzeptieren. –