Есть ли способ сделать ToolStripMenuItem общим для меню и панелей инструментов? - PullRequest
1 голос
/ 30 ноября 2010

Я портирую старый проект VB6 на C #, используя Winforms.В оригинале используется набор ActiveDar DataDynamic для одновременного управления изменениями нескольких элементов в панелях инструментов, меню и ярлыках.Все, что нужно сделать старому коду, чтобы изменить текст элемента, совместно используемого несколькими меню, панелью инструментов и контекстным меню, - это изменить свойство «Заголовок» объекта «инструмент».

Мне кажется, что .NET должен иметь какой-то способ разделения ToolStripItem s между различными контейнерами, но это не похоже на это.Я что-то упустил?

В настоящее время я несколько раз начинал с разных идей, от реализации метода расширения Clone на ToolStripMenuItem объектах и ​​от того, чтобы моя форма отслеживала каждое разделяемое.Это не помогло, когда я понял, что обновление локальной копии не приведет к обновлению других (мне пришлось бы добавлять сложные события обновления, которые являются более сложной задачей, чем простое включение и отключение каждого элемента вручную).Я подумал о создании способа обновления всех элементов на основе его тега.Это также казалось довольно невыполнимым.

Какие техники вы использовали в подобных ситуациях?

Ответы [ 2 ]

3 голосов
/ 01 декабря 2010

Ну, на самом деле это одно из досадных ограничений библиотек .Net GUI-Building *

Обычный обходной путь - это динамическое управление вашими меню, добавление к ним элементов по мере их открытия.Безобразно, но довольно незаметно с точки зрения взаимодействия с пользователем.Хитрость заключается в том, чтобы использовать следующую концепцию пользовательского интерфейса: меню никогда не отображаются одновременно, поэтому вы можете выполнять горячую замену элементов

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

Затем, используя флаги и логику кода, вы сможете узнать, КакМеню / Панель инструментов / ContextMenu открывается , какие элементы оно должно отображать.

0 голосов
/ 04 декабря 2010

Я реализовал SharedMenuItem, ответственность за который состояла в том, чтобы зарегистрировать и обновить элементы пользовательского интерфейса, которые нуждались в изменении. Контекстное меню оказалось достаточно различным, чтобы гарантировать собственный обработчик.

Вместо обновления всех элементов меню я обновил 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;
    }
}
...