0

IoC コンテナーに Unity を使用しており、ブートストラップには次のコードがあります。

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>

そして、Microsoft.Practices.Prism.Modularity が見つからず、Modularity:ModuleCatalog が見つからないという xaml のエラーが既に発生しています。

これは非常にイライラします。私のプロジェクトには Microsoft.Practices.Prism が含まれています。私の Bootstrapper のコードはコンパイルされるので、明らかに Microsoft.Practices.Prism.Modularity.ModuleCatalog が存在します。しかし、CreateModuleCatalog 関数を次のように変更すると、さらに奇妙になります。

using Microsoft.Practices.Prism.Modularity;

...

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

CreateFromXaml が ModuleCatalog に存在しないと表示されます。ModuleCatalog を見つけるのに問題はありませんが、毎回完全な名前空間を入力しないと、その関数は明らかに存在しません。何が起きてんだ?

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」は、クライアントのシェルのメインコンテンツ領域にマップされるユーザー コントロールであることにも注意してください。

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: Bootstrapper の実装: 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 に答える