我正在学习WPF和Caliburn.Micro。我正在关注此处提供的代码: http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper&referringTitle=Documentation
显然这段代码适用于Silverlight,但我的项目是WPF,因此我收到的错误是CompositionHost未定义。
该文件声明我需要直接在wpf中初始化容器,但是没有文档可以显示如何。如何直接初始化容器?
编辑1 引导过滤器在文档中是这样的:
container = CompositionHost.Initialize(
new AggregateCatalog(
AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()
)
);
var batch = new CompositionBatch();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(container);
container.Compose(batch);
我将其转换为:
var catalog =
new AggregateCatalog(
AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>());
this.container = new CompositionContainer(catalog);
var batch = new CompositionBatch();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(this.container);
this.container.Compose(batch);
但是当我运行应用程序时,我收到的错误是MEF无法找到IShell的实现
Could not locate any instances of contract IShell.
我相信我的MEF初始化是不正确的。你能帮我解决一下吗?
答案 0 :(得分:17)
在WPF中,您需要使用显式CompositionContainer
构造函数。在我的WPF和Silverlight共享引导程序中,我使用了以下#if
- #else
指令:
#if SILVERLIGHT
container = CompositionHost.Initialize(catalog);
#else
container = new CompositionContainer(catalog); ;
#endif
修改强>
引导程序将标识实现IShell
接口的组件(假设您的引导程序正在扩展Bootstrapper<IShell>
基类),因此您需要实现一个用{{1}的MEF导出修饰的类}。
通常这将是您的IShell
,声明如下:
ShellViewModel
您可以阅读有关引导程序设置和自定义here的更多信息。