2015-12-14 76 views
0

我對DI /棱鏡等非常陌生,並試圖教我自己。我從AutofacBootstrapper派生出來,它是Prism 6的附加組件。外殼初始化很好,但是在理解模塊註冊時遇到了問題。區域管理器顯示沒有區域

public class MyBootstrapper : AutofacBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     return Container.Resolve<Shell>(); 
    } 

    protected override void InitializeShell() 
    { 
     base.InitializeShell(); 
     Application.Current.MainWindow = (Window) Shell; 
     Application.Current.MainWindow.Show(); 
    } 

    protected override void InitializeModules() 
    { 
     base.InitializeModules(); 
     var builder = new ContainerBuilder(); 
     var regionManager = new RegionManager(); 
     builder.RegisterInstance(regionManager).As<IRegionManager>(); 
     builder.Register(c => new ModuleAModule(c.Resolve<IRegionManager>())); 
     var container = builder.Build(); 
     using (var scope = container.BeginLifetimeScope()) 
     { 
      var component = scope.Resolve<ModuleAModule>(); 
      component.Initialize(); 
     } 
    } 
} 


public class ModuleAModule : IModule 
{ 
    private IRegionManager _regionManager; 
    private IContainer _container; 
    public ModuleAModule(IRegionManager regionManager) 
    { 
     _regionManager = regionManager; 
    } 

    public void Initialize() 
    { 
     _regionManager.RegisterViewWithRegion(RegionNames.ToolbarRegion, typeof(ToolbarView)); 
     _regionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(ContentView)); 
    } 
} 

外殼上來罰款2個區域,但是在初始化結束我檢查_regionManager.Regions.Count並得到0,而不是2,因爲我將創造2個區域。 xaml在下面。

<Window x:Class="WpfApplication1.Shell" 
     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" 
     xmlns:wpfApplication1="clr-namespace:WpfApplication1" 
     Title="Shell"> 
    <DockPanel LastChildFill="True"> 
     <ContentControl DockPanel.Dock ="Top" prism:RegionManager.RegionName="{x:Static wpfApplication1:RegionNames.ToolbarRegion}"/> 
     <ContentControl prism:RegionManager.RegionName="{x:Static wpfApplication1:RegionNames.ContentRegion}"/> 
    </DockPanel> 
</Window> 

RegionNames簡單...

public static class RegionNames 
{ 
    public static readonly string ToolbarRegion = "ToolbarRegion"; 
    public static readonly string ContentRegion = "ContentRegion"; 
} 

所以我的問題是,爲什麼會RegionManager就沒有地區?

+0

我覺得視覺樹的問題,看看http://stackoverflow.com/questions/33607639/region-not-loaded-by-the-regionmanger – toumir

回答

0

對於棱鏡V6您使用了錯誤的命名空間的:

xmlns:prism="http://prismlibrary.com/" 

,然後它的作品。

這裏是我的內容查看代碼:

<UserControl x:Class="WpfApplication3.ContentView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WpfApplication3" 
     mc:Ignorable="d"> 
    <Grid Background="Blue"> 

    </Grid> 
</UserControl> 

和ToolbarView:

<UserControl x:Class="WpfApplication3.ToolbarView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WpfApplication3" 
     mc:Ignorable="d" > 
    <Grid Background="Aqua" Height="20"> 

    </Grid> 
</UserControl> 

編輯:

對不起我forgote的一部分。

public void Initialize() 
{ 
    _regionManager.RegisterViewWithRegion(RegionNames.ToolbarRegion, typeof(ToolbarView)); 
    _regionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(ContentView)); 

    Console.WriteLine(_regionManager.Regions.Count()); 
} 

如果您在Console.WriteLine上設置了一個斷點,您會在此處看到視圖被注入到該區域。那是因爲引導程序的初始化沒有完成。你可以在輸出窗口看到。

DEBUG:初始化模塊..優先級:低。時間戳:2015-12-17 09:58:09Z。

< - Console.WriteLine(_regionManager.Regions.Count());

DEBUG:Bootstrapper序列已完成..優先級:低。時間戳:2015-12-17 09:58:09Z。 < - Boostrapper完成:-)

如果你在程序中,後來問現在你將得到2

我現在希望幫助;-)

+0

你好ascholz,謝謝你的迴應。我已經修復了命名空間,但在此之前,UI已經像現在這樣好了。當您在ModuleAModule類的Intialize()的末尾放置一個斷點時,您獲得了什麼_regionManager.Regions.Count?我得到0,但我不明白爲什麼,因爲我預計計數爲2. – Anand

+0

我已經更新了答案:-) – ascholz

+0

如果這是您尋找的答案?如果是,請將問題標記爲回答:-) – ascholz