2012-09-23 70 views
0

我使用Unity爲我的IoC容器,並在我的引導程序我有這樣的代碼:如何從Xaml創建ModuleCatalog?

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

,我創建了一個名爲它的XML文件「modulecatalog.xaml」與此:

<?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> 
ModuleCatalog未發現:

而且我已經在XAML說Microsoft.Practices.Prism.Modularity找不到和模塊化收到錯誤。

這是非常令人沮喪。我的項目中包含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沒有問題,但是如果我沒有每次輸出完整的名稱空間,那麼該函數顯然不存在。 WTF正在進行?

+0

有趣。我目前正在尋找相同的=)。如果我找到答案,我在這裏發帖 – KroaX

回答

0

嘗試顯式解決這樣的ModuleCatalogtype,它應該工作

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

的錯誤與沒有找到模塊化:ModuleCatalog都是一樣的對我,而且應用程序運行良好。

啊!我差點忘了。設置modules.xaml文件資源

+0

你說你仍然在你的xaml文件中發現錯誤,認爲模塊化:ModuleCatalog沒有找到,但仍然可以工作嗎? – Nick

+0

沒錯。我的Modules.xaml得到解析正確的ReadFromXaml方法和我的模塊正在加載我的應用程序。只要確保你的dll和這個文件中的命名空間是正確的 – KroaX

0

我也掙扎與此有關。我終於通過了以下解決了這個:

設置: 在你的shell,你應該有你的區域定義:

<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」是一個用戶控件,它被映射到客戶端shell的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(); 
    } 
} 

結論: 審查這些步驟後,應該能夠運行應用程序並觀察自舉一個模塊加載得到一個棱鏡應用程序的結果。

注意: 請隨時提供有關我如何可以更好地闡明這一點的反饋。