2016-06-02 18 views
1

Ich möchte, dass sich mein ToolStrip-Hintergrund ändert, wenn ein Element nicht gespeichert wird.ToolStrip.Background ändert nur den Hintergrund der Schaltfläche (C# /. NET/WinForms)

Um den Hintergrund meiner Toolstrip machen ich meine eigenen Renderer verwenden:

class ToolStripRenderer : ToolStripProfessionalRenderer 
    { 
     private MenuBarForm parent; 

     public ToolStripRenderer(MenuBarForm Parent) 
     { 
      parent = Parent; 
     } 

     protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) 
     { 
      if (parent.controlItems.Last().Unsaved) 
       e.Graphics.FillRectangle(new System.Drawing.Drawing2D.LinearGradientBrush(e.ToolStrip.ClientRectangle, SystemColors.ControlLightLight, Color.Red, 90, true), e.AffectedBounds); 
      else 
       e.Graphics.FillRectangle(new System.Drawing.Drawing2D.LinearGradientBrush(e.ToolStrip.ClientRectangle, SystemColors.ControlLightLight, SystemColors.ControlDark, 90, true), e.AffectedBounds); 
     } 
    } 

Das erste Mal, das Toolstrip mit einem grau bis dunkelgrau Design macht richtig macht:

CorrectToolstrip

Wenn der Balken jedoch rot wird, werden nur die Schaltflächen rot, auf denen die Maus schwebt:

IncorrectToolstrip

Ich möchte, dass der ganze Toolstrip auf einmal rot ist.

Ich habe bereits versucht, e.AffectedBounds zu e.ToolStrip.Bounds, vergeblich zu ändern.

+1

Klingt wie es nicht denken, dass es das Steuerelement aktualisieren muss. Haben Sie versucht, Invalidate() auf dem Toolstrip aufzurufen? Um es zu zwingen, zu aktualisieren? – MrApnea

+0

Vielen Dank für Ihre Antwort. Ich habe es zu der Frage hinzugefügt. –

+0

Bitte posten Sie die Antwort nicht als Teil der Frage. Es ist verwirrend für zukünftige Leser. Veröffentlichen Sie es als Antwort. –

Antwort

0

Ich fand diese Lösung Dank FSDaniel Kommentar:

von Invalidate() bis zum Ende des OnRenderToolStripBackground die Toolstrip Zugabe in der Tat vollständig rot geworden war, sondern verursacht auch die Anwendung in einer Endlos-Schleife zu gehen. Ich löste dies, indem ich ein Ereignis erstellte, das durch Ändern der Eigenschaft UnSaved ausgelöst wurde. Das Formular mit dem Toolstrip hat dann eine Methode für dieses Ereignis abonniert, das toolstrip.Invalidate() aufgerufen hat. Auf diese Weise wird Invalidate() nur bei Bedarf verwendet.

1

Sie können eine benutzerdefinierte Farbtabelle vererben ProfessionalColorTable erstellen und relevante Eigenschaften außer Kraft setzen Hintergrundfarbe zu ändern:

public class CustomColorTable : ProfessionalColorTable 
{ 
    public override Color ToolStripGradientBegin 
    { 
     get { return Color.Red; } 
    } 
    public override Color ToolStripGradientMiddle 
    { 
     get { return Color.Red; } 
    } 
    public override Color ToolStripGradientEnd 
    { 
     get { return SystemColors.ControlLightLight; } 
    } 
} 

Um Ihren ToolStrip Hintergrund zu ändern, ein neues ToolStripProfessionalRenderer zuweisen, die Ihre eigene Farbtabelle verwendet, um ToolStripManager.Renderer:

ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable()); 

Um den ursprünglichen Beruf Renderer eingestellt:

ToolStripManager.Renderer = new ToolStripProfessionalRenderer(); 
+0

Vielen Dank für Ihre schnelle Antwort. Diese Lösung funktioniert leider nicht für mich. Ich habe versucht, Ihre CustomColorTable mit diesem Code hinzuzufügen, um den Renderer zu ändern ' if (controlItems.Last(). Nicht gespeichert) ToolStripManager.Renderer = new ToolStripProfessionalRenderer(); sonst ToolStripManager.Renderer = new ToolStripProfessionalRenderer (new CustomColorTable()); ' –

+0

Um die Lösung zu testen genügt es, die' RenderMode' Eigenschaft ihres 'ToolStrip' auf' ManagerRenderMode' zu ​​setzen und dann 'ToolStripManager.Renderer' zu ändern. Um einen unabhängigen Test von Ihrer 'UnSaved'-Eigenschaft zu arrangieren, können Sie' ToolStripManager.Renderer = new ToolStripProfessionalRenderer (new CustomColorTable()); 'in einem Knopfklick aufrufen, um sicherzustellen, dass es funktioniert. –

+0

Lassen Sie mich wissen, wenn Sie ein Problem bei der Anwendung der Antwort haben. Es ist getestet und funktioniert ordnungsgemäß. –