2010-11-30 12 views
1

Ich portiere ein altes VB6-Projekt mit Winforms nach C#. Das Original verwendet die ActiveBar-Suite von DataDynamic, um Änderungen an mehreren Elementen in Symbolleisten, Menüs und Shortcut-Ribbons gleichzeitig zu verwalten. Der alte Code muss nur den Text eines Elements ändern, das für mehrere Menüs freigegeben ist. Eine Werkzeugleiste und ein Kontextmenü ändern die Eigenschaft "Beschriftung" des "Werkzeug" -Objekts.Gibt es eine Möglichkeit, ein ToolStripMenuItem für Menüs und ToolBars freizugeben?

Ich fühle mich wie .NET muss haben einen Weg ToolStripItem s zwischen einer Vielzahl von Behältern zu teilen, aber es sieht nicht so aus, wie es der Fall ist. Fehle ich etwas?

Zur Zeit habe ich mehrere Male mit einer Vielzahl von Ideen begonnen, von der Implementierung einer Clone Erweiterungsmethode auf ToolStripMenuItem Objekte und meine Form verfolgen jeden Sharable. Das scheiterte, als ich feststellte, dass das Aktualisieren der lokalen Kopie die anderen nicht aktualisieren würde (ich müsste komplexe Aktualisierungsereignisse hinzufügen, die mehr Arbeit sind, als jedes Element manuell ein- und auszuschalten). Ich habe darüber nachgedacht, eine Möglichkeit zu schaffen, alle Elemente anhand ihres Tags zu aktualisieren. Das erschien mir auch ziemlich undurchführbar.

Welche Techniken haben Sie in ähnlichen Situationen verwendet?

Antwort

3

Nun, dies ist tatsächlich eine der lästigen Einschränkungen von .Net GUI-Gebäuden Bibliotheken

Eine gemeinsame Abhilfe würde Ihre Menüs dynamisch verwalten werden, das Hinzufügen von Elementen zu ihnen, als sie zu öffnen sind. Hässlich, aber ziemlich nahtlos aus Sicht der Benutzerfreundlichkeit. Der Trick ist, die folgende UI-Design pradigm zu verwenden: Die Menüs werden niemals gleichzeitig angezeigt, so können Sie Hot-Swap-Artikel

private void myContextMenuStrip_Opening(object sender, CancelEventArgs e) 
{ 
    myContextMenuStrip.Items.Insert(3, myToolStripMenuItem); 
} 

Dann Flaggen und Code-Logik würden Sie in der Lage sein, zu wissen, Als Menü/ToolBar/ContextMenu wird geöffnet, welche Items es anzeigen soll.

+0

ist gegeben „Menüs gleichzeitig nie angezeigt werden,“ nicht ganz richtig, dass wir beide haben 'Toolbar' kategorisiert mit 'Menu' und' ContextMenu'. – Crisfole

0

Ich wickelte die Implementierung einer SharedMenuItem, die Verantwortung war zu registrieren und zu aktualisieren die UI-Elemente, die Änderung benötigt. Das Kontextmenü ist unterschiedlich genug, um einen eigenen Handler zu rechtfertigen.

Anstatt alle MenuItems zu aktualisieren, habe ich die SharedMenuItem aktualisiert, die sich dann um die anderen Änderungen gekümmert hat.

[EDIT] Der Code (Hinzufügen anderer Eigenschaften ist trivial/automatisch generierbaren auch):

public class SharedMenuItem 
{ 
    bool enabled = false; 
    public bool Enabled 
    { 
     get { return enabled; } 
     set 
     { 
      enabled = value; 
      foreach (var member in members) 
      { 
       member.Enabled = value; 
      } 
     } 
    } 

    bool visible; 
    public bool Visible 
    { 
     get { return visible; } 
     set 
     { 
      visible = value; 
      foreach (var member in members) 
      { 
       member.Visible = visible; 
      } 
     } 
    } 

    string text; 
    public string Text 
    { 
     get { return text; } 
     set 
     { 
      text = value; 
      foreach (var member in members) 
      { 
       member.Text = text; 
      } 
     } 
    } 

    string toolTipText = ""; 
    public string ToolTipText 
    { 
     get { return toolTipText; } 
     set 
     { 
      toolTipText = value; 
      foreach (var member in members) 
      { 
       member.ToolTipText = toolTipText; 
      } 
     } 
    } 

    private List<ToolStripItem> members = new List<ToolStripItem>(); 

    public void Remove(ToolStripItem member) 
    { 
     members.Remove(member); 
    } 

    public void Add(ToolStripItem member) 
    { 
     members.Add(member); 
    } 

    public SharedMenuItem(string text) 
    { 
     this.text = text; 
    } 
} 
+0

Interessant ... Zeigen Sie Ihren Code! :-) –

+0

Aus technischer Sicht, und technisch gesprochen, sind Items in verschiedenen Menüs - erst recht nicht gleichzeitig dargestellt - in der Tat andere Items in dir, obwohl sie im Finale auf die gleiche Aktion zeigen. –

+0

Ja, das sind verschiedene Dinge, aber sie müssen immer eine Reihe von Eigenschaften teilen (eine perfekte "Beobachter" -Mustermöglichkeit, die * eine Art * ist, was das oben Gesagte ist). – Crisfole