C# 在Forms treeview中扩展节点类型和上下文操作的最佳方法

C# 在Forms treeview中扩展节点类型和上下文操作的最佳方法,c#,forms,treeview,mef,extensibility,C#,Forms,Treeview,Mef,Extensibility,我正在为VisualStudio2008开发一个VisualStudio插件,它显示一个树视图,提供服务器产品中内容的视图。服务器产品包含不同类型的节点,每个节点都有自己类型的上下文菜单(右键单击菜单) 对于新类型的节点和连接到节点的操作,我目前只需在项目中添加代码2。我想断开节点类型和节点上可用操作的连接,这样我就可以使用插件模型将节点和条目添加到上下文菜单中。MEF可能是一个很好的候选人。有没有人对如何以简单明了的方式实现这一点有好的想法,以便插件开发人员不必做大量的管道工作?我将提供一个公

我正在为VisualStudio2008开发一个VisualStudio插件,它显示一个树视图,提供服务器产品中内容的视图。服务器产品包含不同类型的节点,每个节点都有自己类型的上下文菜单(右键单击菜单)


对于新类型的节点和连接到节点的操作,我目前只需在项目中添加代码2。我想断开节点类型和节点上可用操作的连接,这样我就可以使用插件模型将节点和条目添加到上下文菜单中。MEF可能是一个很好的候选人。有没有人对如何以简单明了的方式实现这一点有好的想法,以便插件开发人员不必做大量的管道工作?

我将提供一个公共库,您的代码和插件库都链接到该库(称之为契约依赖项)。在这里,为节点类型定义一个接口,如INodeType。此外,考虑在其中实现INodeType的抽象对象类型,并提供插件作者可以在其构造函数中设置的一些有用属性。 INodeType的属性之一是返回windows窗体上下文菜单的ContextMenu属性

在代码中创建属性:

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

我希望我没有弄乱语法,但这是一般的想法。

我将提供一个公共库,您的代码和插件库都链接到该库(称之为契约依赖项)。在这里,为节点类型定义一个接口,如INodeType。此外,考虑在其中实现INodeType的抽象对象类型,并提供插件作者可以在其构造函数中设置的一些有用属性。 INodeType的属性之一是返回windows窗体上下文菜单的ContextMenu属性

在代码中创建属性:

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

我希望我没有弄乱语法,但这是大意。

恐怕我还不明白。这种方法是否支持通过添加(并注册?)一个程序集来添加插件,还是需要为此重新编译主应用程序?[Import…]和[Export…]做什么?添加插件所需做的就是在代码查找插件的目录中放置更多DLL,它将找到导出此类型(INodeType)的契约名称(nodeType)的任何内容。我的答案是假设你对MEF有一个基本的介绍:在这种情况下,你必须重新启动你的代码,让它看到新的插件,但该网站上有一些例子显示了如何“重新编写”,它将能够在不重新启动的情况下找到新的插件。嗨,斯科特,这是我的问题:-)我听说过MEF,但是我不知道,所以我不明白你说的是MEF术语!我要深入研究一下。非常感谢你!恐怕我还不明白。这种方法是否支持通过添加(并注册?)一个程序集来添加插件,还是需要为此重新编译主应用程序?[Import…]和[Export…]做什么?添加插件所需做的就是在代码查找插件的目录中放置更多DLL,它将找到导出此类型(INodeType)的契约名称(nodeType)的任何内容。我的答案是假设你对MEF有一个基本的介绍:在这种情况下,你必须重新启动你的代码,让它看到新的插件,但该网站上有一些例子显示了如何“重新编写”,它将能够在不重新启动的情况下找到新的插件。嗨,斯科特,这是我的问题:-)我听说过MEF,但是我不知道,所以我不明白你说的是MEF术语!我要深入研究一下。非常感谢你!