0

我将 Unity 用于我的 IoC 容器,在我的引导程序中我有以下代码:

protected override IModuleCatalog CreateModuleCatalog()
{
  return Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(
    new Uri("modulecatalog.xaml", UriKind.Relative));
}

我创建了一个名为“modulecatalog.xaml”的xml文件,其中包含:

<?xml version="1.0" encoding="utf-8" ?> 
<Modularity:ModuleCatalog
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib"
  xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">

</Modularity:ModuleCatalog>

而且我已经在 xaml 中收到错误,说找不到 Microsoft.Practices.Prism.Modularity 并且找不到 Modularity:ModuleCatalog。

这非常令人沮丧。我的项目中包含 Microsoft.Practices.Prism。我的引导程序中的代码编译得很明显 Microsoft.Practices.Prism.Modularity.ModuleCatalog 确实存在。但更奇怪的是,如果我将 CreateModuleCatalog 函数更改为:

using Microsoft.Practices.Prism.Modularity;

...

protected override IModuleCatalog CreateModuleCatalog()
{
  return ModuleCatalog.CreateFromXaml(
    new Uri("modulecatalog.xaml", UriKind.Relative));
}

它说在 ModuleCatalog 上不存在 CreateFromXaml。查找 ModuleCatalog 没有问题,但如果我不每次都输入完整的命名空间,该功能显然不存在。WTF正在进行吗?

4

2 回答 2

0

尝试像这样显式解析 ModuleCatalogtype ,它应该可以工作

protected override Microsoft.Practices.Prism.Modularity.IModuleCatalog CreateModuleCatalog()
{
   return Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml( new Uri( "Modules.xaml", UriKind.Relative ) );
}

未找到 Modularity:ModuleCatalog 的错误对我来说是相同的,但应用程序运行良好。

啊我差点忘了。将 modules.xaml 文件设置为资源

于 2012-09-23T17:31:20.947 回答
0

我也为此苦苦挣扎。我最终通过以下方式解决了这个问题:

设置: 在您的外壳中,您应该定义您的区域:

<Window x:Class="Prism101.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://www.codeplex.com/prism"
        Title="MainWindow" Height="350" Width="525">
    <Grid x:Name="LayoutRoot" Background="White">
        <ContentControl prism:RegionManager.RegionName="MainContent" />
    </Grid>
</Window>

第 1 步:添加对模块项目/程序集的引用。

第 2 步:在模块目录中声明一个模块: 这将在您的模块项目中。

<Modularity:ModuleCatalog 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism.Composition">

    <Modularity:ModuleInfo 
         Ref="Prism101.Modules.Core.xap"
         ModuleName="CoreModule" 
         ModuleType="Prism101.Modules.Core.CoreModule, Prism101.Modules.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
     />

</Modularity:ModuleCatalog>

第 3 步:实现您的模块: 注意框架将如何为您初始化 RegionManager 和 UnityContainer。另请注意,“WelcomeView”是一个用户控件,它被映射到客户端外壳的 maincontent 区域。

namespace Prism101.Modules.Core
{
    public class CoreModule : IModule
    {
        private readonly IUnityContainer container;
        private readonly IRegionManager regionManager;

        public CoreModule(IUnityContainer container, IRegionManager regionManager)
        {
            this.container = container;
            this.regionManager = regionManager;
        }

        public void Initialize()
        {
            var view = new WelcomeView();
            regionManager.AddToRegion("MainContent", view);
        }
    }
}

第 4 步:实现引导程序: 在 CreateModuleCatalog 方法中,确定目录模块所在的程序集的名称以及它的目录路径。

class Bootstrapper : UnityBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        var shell = new MainWindow();
        Application.Current.MainWindow = shell;

        return shell;
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        var assemblyName = "Prism101.Modules.Core";
        var filePath = "ModuleCatalog.xaml";
        var uriPath = string.Format("/{0};component/{1}", assemblyName, filePath);

        var uri = new Uri(uriPath, UriKind.Relative);
        var moduleCatalog = Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(uri);

        return moduleCatalog;
    }

    protected override void InitializeShell()
    {
        base.InitializeShell();
        App.Current.MainWindow.Show();
    }
}

结论: 在查看了这些步骤之后,应该能够运行应用程序并观察引导 prism 应用程序并加载模块的结果。

注意: 请随时就我如何更好地表达这一点提供反馈。

于 2014-08-02T15:01:33.667 回答