我正在使用 Prism 和 Unity for DI 运行 WPF 应用程序。我有一个 Shell:MainWindow.xaml、一个容器:AppContainer.xaml,以及启动视图:StartupView.xaml。
主窗口.xaml
<Window x:Class="App.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
...
...
...
>
<Grid Background="Transparent">
<ContentControl x:Name="ContainerRegion"
prism:RegionManager.RegionName="ContainerRegion"/>
</Grid>
</Window>
应用容器.xaml
<UserControl x:Class="App.Views.AppContainer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
...
...
...
>
<Grid>
<ContentControl x:Name="MainViewRegion"
prism:RegionManager.RegionName="MainViewRegion" />
</Grid>
</UserControl>
StartupView.xaml 代码不相关。
我在引导程序中实例化 shell。我添加了一个 AppContainerModule。这是初始化():
public override void Initialize()
{
UnityContainerExtensions.RegisterType(_unityContainer, typeof(Object), typeof(AppContainer), InstanceNames.AppContainer); //InstanceNames is a static class of "magic" strings
IRegion mviewRegion = _regionManager.Regions[RegionNames.ContainerRegion]; //ContainerRegion is the Region declared in MainWindow.xaml
if (mviewRegion == null) return;
_regionManager.RequestNavigate(RegionNames.ContainerRegion, new Uri(InstanceNames.AppContainer, UriKind.Relative));
}
这是我的 StartupViewModule.Initialize()
public override void Initialize()
{
UnityContainerExtensions.RegisterType(_unityContainer, typeof(object), typeof(StartupView), InstanceNames.StartupView);
IRegion mviewRegion = _regionManager.Regions[RegionNames.MainViewRegion]; //MainViewRegion is declared in AppContainer.xaml
if (mviewRegion == null) return;
_regionManager.RequestNavigate(RegionNames.MainViewRegion, new Uri(InstanceNames.StartupView, UriKind.Relative));
}
在一个小图中:
MainWindow.xaml -> [ContainerRegion]
|
|
\/
AppContainer.xaml -> [MainViewRegion]
|
|
\/
StartupView.xaml
我使用了 [ModuleDependency] 属性来确保 StartupView 在 AppContainer 之后被初始化。
上面的代码有效,顺便说一句!
我的问题是关于我在偶然发现此解决方案之前拥有的先前代码。我在启动时遇到崩溃,错误是当 StartupView 试图注入自身时(在 StartupViewModule.Initialize() 期间)prism 找不到 MainViewRegion。将代码更改为上述代码有效。AppContainerModule中的以下内容不起作用
_unityContainer.RegisterType<AppContainer>(InstanceNames.AppContainer);
同样,起作用的是:
UnityContainerExtensions.RegisterType(_unityContainer, typeof(Object), typeof(AppContainer), InstanceNames.AppContainer);
所以我的问题是,为什么?