使用MEF在.NET应用程序中扩展菜单和上下文菜单

时间:2011-08-09 18:45:47

标签: c# menu mef extensibility

我正在尝试提供类似于Visual Studio 2010提供的菜单和上下文菜单架构,以便我可以使用扩展提供的其他子项扩展我当前的菜单。我正在使用MEF(Managed Extensibility Framework)。 例如,Resharper扩展在任何可能的位置(上下文菜单的顶部,中间或底部或菜单项)中添加菜单项和上下文菜单项。 怎么可以提供这样的功能?我是否必须索引shell的每个菜单项并使用扩展名引用索引以将其定位在子项目上? 我希望我的问题足够清楚。如果不是,我会非常乐意添加一些澄清。

1 个答案:

答案 0 :(得分:0)

我不确定是否有一种最好的方法可以做到这一点。但是这里有一些想法需要考虑:

一个相当简单的解决方案是使用单个合同(即IMenuIten)并使用元数据来控制命令出现在哪个菜单中以及在什么位置。一种方法是使用“索引”,虽然它应该是一个双倍并用于对菜单中的项目进行排序,这样每个项目都不需要知道它在菜单中的绝对位置。另一种方法是在菜单项上包含元数据,该元数据提供应该在当前项之前和之后的其他项的列表。然后,您可以对菜单项进行拓扑排序,以获得显示它们的顺序。

根据您的菜单行为需要的复杂/动态程度,您可能会发现使用导出元数据无法很好地表达它。在这种情况下,您可以将功能移动到合同本身 - 即在IMenuItem合同上添加属性或方法。这样,您就可以运行代码来计算所需的值。

另一种解决方案是不直接导出菜单项。相反,您可以拥有由组件导入的菜单服务。该服务将具有Register方法,该方法将菜单项添加到菜单。在我看来,这使得添加菜单项更加繁琐,所以我不推荐它,除非你需要它的原因。如果可用的菜单项应根据应用程序的当前上下文进行更改,则可能是合适的。请注意,如果你这样做,只需要一个导入菜单服务的类就不会导致创建和编写类。该类需要导出在系统中其他位置导入的内容。