让我解释一下如何设置这样的东西。您可以在官方文档中查找更多信息
最好的实现是使用接口和鸭子类型。
public interface IModule {
DataTemplate Template { get; set; }
string Name{get;set;}
...
}
然后对于每个插件,继承这个接口
[Export(typeof(IModule ))]
public class SampleModule : IModule {
private DataTemplate template;
public DataTemplate IModule.Template {
get { return this.teplate; }
set { this.template = value; }
}
private string name = "SamplePlugin";
public string IModule.Name{
get { return this.name ; }
set { this.name = value; }
}
...
}
SampleModule 类在单独的程序集中,而 IModule 与 Application 和每个模块程序集都相同。
现在您需要加载应用程序可用的每个模块。此代码片段来自应用程序窗口
...
[ImportMany]
public IEnumerable<IModule> ModulesAvailable {get;set;}
...
public void LoadModules(string path) {
DirectoryCatalog catalog = new DirectoryCatalog(path);
catalog.ComposeParts(this);
}
现在您可以使用 foreach 循环并将它们添加到应用程序资源
foreach(IModule module in ModulesAvailable) {
Application.Current.Resources.Add(module.Template, module.Name);
}
这只是概念,代码未经测试。
我在几个月前做的高中期末项目中使用了 MEF ,所以你可以看看我的代码。它是支持公式的电子表格应用程序,所有操作和操作数都作为插件加载,因此非常灵活。