1

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

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

目前,我已经从各种想法开始了好几次,从Clone在对象上实现扩展方法到ToolStripMenuItem让我的表单跟踪每个可共享的。当我意识到更新本地副本不会更新其他副本时,那失败了(我必须添加复杂的更新事件,这比手动打开和关闭每个项目要多工作)。我已经考虑创建一些基于其标签更新所有项目的方法。这似乎也很不可行。

在类似的情况下,你们都使用了哪些技术?

4

2 回答 2

3

好吧,这实际上是 .Net GUI-Building Libraries 令人讨厌的限制之一

一个常见的解决方法是动态管理您的菜单,在它们打开时向它们添加项目。从用户体验的角度来看,丑陋但非常无缝。诀窍是使用以下 UI 设计规范:菜单从不同时显示,因此您可以热交换项目

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

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

于 2010-12-01T18:18:41.173 回答
0

我最终实现了一项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;
    }
}
于 2010-12-03T21:14:54.160 回答