2010-11-30 42 views
1

Je porte un ancien projet VB6 en C#, en utilisant Winforms. L'original utilise la suite ActiveBar de DataDynamic pour gérer simultanément les modifications de plusieurs éléments dans les barres d'outils, les menus et les rubans de raccourci. Tout l'ancien code doit faire pour modifier le texte d'un élément partagé entre plusieurs menus, une barre d'outils et un menu contextuel est modifier la propriété "Légende" de l'objet "outil".Existe-t-il un moyen de partager un ToolStripMenuItem entre Menus et ToolBars?

Je pense que .NET doit avoir un moyen de partager ToolStripItem s entre une variété de conteneurs, mais il ne semble pas le faire. Est-ce que je manque quelque chose?

Actuellement, j'ai commencé plusieurs fois avec une variété d'idées, de l'implémentation d'une méthode d'extension Clone sur des objets ToolStripMenuItem et d'avoir ma forme garder une trace de chaque partageable. Cela a échoué quand j'ai réalisé que la mise à jour de la copie locale ne mettrait pas à jour les autres (je devrais ajouter des événements de mise à jour complexes qui sont plus de travail que de simplement activer et désactiver chaque élément à la main). J'ai envisagé de créer un moyen de mettre à jour tous les éléments en fonction de son tag. Cela semblait également infaisable.

Quelles techniques avez-vous utilisées dans des situations similaires?

Répondre

3

Eh bien, cela est en fait l'une des limitations gênantes de .Net GUI-Building Bibliothèques

Une solution commune serait la gestion de vos menus dynamiquement, ajouter des articles à eux comme ils ouvrent. Laide mais tout à fait transparente du point de vue de l'expérience utilisateur. L'astuce est d'utiliser la conception d'interface utilisateur suivante pradigm: Les menus ne sont jamais affichés simultanément, de sorte que vous pouvez regrouper des éléments remplaçables à chaud

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

Ensuite, en utilisant des drapeaux et la logique de code que vous seriez en mesure de savoir, que le menu/ToolBar/ContextMenu est ouvert, quels éléments il doit afficher.

+0

"Menus ne sont jamais affichées simultanément" est pas tout à fait vrai, étant donné que nous avons tous deux 'Toolbar' catégorisés avec 'Menu' et' ContextMenu'. – Crisfole

0

J'ai fini par implémenter un SharedMenuItem dont la responsabilité était d'enregistrer et de mettre à jour les éléments de l'interface utilisateur qui nécessitaient des modifications. Le menu contextuel est assez différent pour justifier son propre gestionnaire. Au lieu de mettre à jour tous les éléments de menu, j'ai mis à jour le SharedMenuItem qui a ensuite pris en charge les autres modifications.

[EDIT] Le code (en ajoutant d'autres propriétés est encore trivial/automatiquement-productible):

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

Intéressant ... Montrez/partagez votre code! :-) –

+0

Cependant, d'un point de vue design, et techniquement parlant, les éléments des différents menus -a fortiori montrés simultanément, SONT en effet différents Articles dans votre cas, bien que pointant vers l'action SAME en finale. –

+0

Oui, ce sont des objets différents, mais ils ont besoin de partager un ensemble de propriétés à tout moment (une opportunité de motif "Observer" parfaite qui est * en quelque sorte * ce qui est ci-dessus). – Crisfole