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

时间:2010-11-30 16:46:43

标签: .net winforms vb6-migration toolstrip menustrip

我正在使用Winforms将一个旧的VB6项目移植到C#。原始版本使用DataDynamic的ActiveBar套件同时管理工具栏,菜单和快捷方式色带中多个项目的更改。所有旧代码必须做的是更改多个菜单,工具栏和上下文菜单之间共享的项目的文本,更改“工具”对象的“标题”属性。

我觉得.NET 必须能够在各种容器之间共享ToolStripItem,但看起来并不像。我错过了什么吗?

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

在类似情况下,您使用了哪些技术?

2 个答案:

答案 0 :(得分:3)

嗯,这实际上是.Net GUI-Building Libraries的烦人限制之一

常见的解决方法是动态管理菜单,在打开时向其添加项目。从用户体验的角度来看,丑陋但相当无缝。 诀窍是使用以下UI设计范例:菜单永远不会同时显示,因此您可以热插拔项目

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

然后使用标志和代码逻辑,您将能够知道,当菜单/工具栏/ ContextMenu被打开时,它应该显示哪些项目。

答案 1 :(得分:0)

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

我没有更新所有的MenuItem,而是更新了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;
    }
}