有没有办法在菜单和工具栏之间共享ToolStripMenuItem?

问题描述:

我正在使用Winforms将旧的VB6项目移植到C#。原始使用DataDynamic的ActiveBar套件同时管理工具栏,菜单和快捷功能区中的多个项目的更改。所有的旧代码都必须改变在几个菜单,工具栏和上下文菜单之间共享的项目的文本是改变“工具”对象的“标题”属性。有没有办法在菜单和工具栏之间共享ToolStripMenuItem?

我觉得像.NET 必须有不同容器之间共享ToolStripItem s的方式,但它看起来并不像。我错过了什么吗?

目前我已经有各种想法多次启动,从ToolStripMenuItem对象实施Clone扩展方法,并有我的形式跟踪每个共享的。当我意识到更新本地副本不会更新其他人时(我不得不添加更复杂的更新事件,而不是简单地手动打开和关闭每个项目),失败了。我考虑过创建一些基于标签来更新所有项目的方法。这似乎也是不可行的。

你们都在类似的情况下使用过什么技术?

好吧,这其实是净GUI构建库

一种常见的解决方法是动态地管理你的菜单的烦人的限制之一,将项目添加到他们,因为他们正在打开。从用户体验的角度来看,它很难但很完美。 诀窍是使用下面的UI设计pradigm:菜单从不同时显示,这样你就可以使用标志和代码逻辑,你就可以知道,作为菜单/热插拔项目

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

ToolBar/ContextMenu被打开,它应该显示哪些项目。

+0

“菜单从不同时显示”并不完全正确考虑到我们都有`Toolbar`归类用`Menu`和`ContextMenu`。 – Crisfole 2010-12-01 19:29:05

我结束了实施SharedMenuItem的职责是注册和更新需要更改的UI元素。上下文菜单不同,足以保证自己的处理程序。

而不是更新所有MenuItems我更新SharedMenuItem,然后负责其他更改。

[编辑]代码(添加其它性质是微不足道/自动-可生成的偶数):

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

有趣...显示/分享您的代码! :-) – 2010-12-04 07:08:25