去年我使用页面导航构建了一个 WPF 应用程序,没有使用 MVVM。最近,我被要求为我在 WPF MVVM 中使用 Caliburn Micro 和 MEF 所做的同一客户构建一个新应用程序。现在我的客户要求我将新应用程序集成到旧应用程序中。
我的想法是在旧应用程序中添加一个新页面,并将新应用程序的外壳集成ContentControl
到此页面的 a 中。
我现在的问题是旧应用程序是由
<StartupUri="Views\NavWindow.xaml">
app.xaml 中的条目,而新应用程序由引导程序启动,例如
<local:AppBootstrapper x:Key="bootstrapper" />
AppBootstrapper 的样子
class AppBootstrapper : Bootstrapper<ShellViewModel>
{
private CompositionContainer container;
protected override void Configure()
{
container = new CompositionContainer(new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));
CompositionBatch batch = new CompositionBatch();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(container);
container.Compose(batch);
}
protected override object GetInstance(Type serviceType, string key)
{
string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
var exports = container.GetExportedValues<object>(contract);
if (exports.Count() > 0)
{
return exports.First();
}
throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
}
}
ShellViewModel
因此,据我了解,对于新应用程序,引导程序会初始化整个应用程序,调用ShellView
.
因为我EventAggregator
在新应用程序中使用 将消息从一个视图模型发送到另一个视图模型,所以我认为我不能仅仅摆脱引导程序并使用 Caliburn Micro 的视图优先模型。
所以我的问题是:我可以自己从旧应用程序中调用引导程序吗?如果可以,我应该将它的实例存储在哪里,以及如何告诉 Caliburn Micro 将ShellView
.
任何帮助表示赞赏。