Наилучший подход к расширению типов узлов и контекстных действий в Forms treeview

StackOverflow https://stackoverflow.com/questions/931435

Вопрос

Я работаю над надстройкой Visual Studio для Visual Studio 2008, которая отображает treeview, предоставляющий представление содержимого в серверном продукте.Серверный продукт содержит различные типы узлов, и каждый узел имеет свой собственный тип контекстного меню (меню, вызываемое правой кнопкой мыши).

Для новых типов узлов и действий, связанных с узлом, я в настоящее время просто добавляю код в свой проект.Я хотел бы отключить мои типы узлов и действия, доступные на узле, в таком количестве, чтобы я мог добавлять узлы и записи в контекстное меню с помощью модели плагина.МЭФ, вероятно, был бы хорошим кандидатом.У кого-нибудь есть хорошая идея о том, как реализовать это простым и понятный способом, чтобы разработчику плагинов не приходилось много возиться?

Это было полезно?

Решение

Я бы предоставил общую библиотеку, на которую ссылаются как ваш код, так и библиотеки плагинов (назовем это зависимостью контракта).Там определите интерфейс для типа узла, например INodeType .Кроме того, рассмотрите возможность реализации AbstractNodeType, который реализует INodeType и предоставляет некоторые полезные свойства, которые автор плагина может установить в своем конструкторе.

Одним из свойств INodeType является свойство ContextMenu, которое возвращает контекстное меню Windows forms.

В вашем коде создайте свойство:

[Import("NodeTypes", typeof(INodeType))]
public IEnumerable<INodeType> extensionNodeTypes { get; set; }

Вы можете просто перечислить это после того, как составите текст.

В коде плагина они объявляли бы новые типы узлов примерно так (возможно, не компилируются):

[Export("NodeTypes", typeof(INodeType))]
public class SomeNodeType : AbstractNodeType
{
    public SomeNodeType()
    {
        this.ContextMenu = base.BuildContextMenu(/* ... */);
        /* etc. */
    }
    /* ... other custom logic ... */
}

Я надеюсь, что я не перепутал синтаксис, но это общая идея.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top