0

我正在使用 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); 

所以我的问题是,为什么?

4

0 回答 0