1

去年我使用页面导航构建了一个 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.

任何帮助表示赞赏。

4

1 回答 1

0

CM 是如此之轻,以至于在这些情况下,实际上值得一看源代码以了解特定类实际上在做什么。

之所以Bootstrapper有效,是因为在应用程序的资源文件中声明它会强制对其进行实例化。构造函数调用Start实例并设置聚合器、IOC 等。

https://caliburnmicro.codeplex.com/SourceControl/changeset/view/4de6f2a26b21#src/Caliburn.Micro.Silverlight/Bootstrapper.cs

如果您要将应用程序加载到ContentControl另一个应用程序中,我看不出它不会启动 CM 的原因,因为加载的应用程序的资源仍将被处理、实例化和启动Bootstrapper等。你试过了吗它在一个测试项目中?这可能是你的第一选择。

There may be some areas where CMs default implementation of Bootstrapper might not be ideal, but on first glance I can't see any glaring issues (not sure what happens to the application events such as OnStartup etc when you load a sub-application so you might want to look at that). Worst case you can roll your own Bootstrapper for the sub-app and just rebuild with the tweaked functionality.

于 2013-01-31T09:48:11.200 回答