C# 应用程序启动时加载区域

C# 应用程序启动时加载区域,c#,wpf,prism,C#,Wpf,Prism,我在理解Prism中区域导航的工作原理时遇到了一些困难。我正在尝试创建一个基于MVVM的应用程序,它加载一个主窗口,并显示由登录表单生成的视图。提交登录表单后,我想导航到一个新的UserControl。我想知道在不使用模块的情况下这是否也是可行的,但是对于当前的实现,它是模块化的 使用此当前代码,将显示带有按钮的菜单栏,但不会显示登录视图 主模块 App.xaml.cs protected override Window CreateShell() { re

我在理解Prism中区域导航的工作原理时遇到了一些困难。我正在尝试创建一个基于MVVM的应用程序,它加载一个主窗口,并显示由登录表单生成的视图。提交登录表单后,我想导航到一个新的
UserControl
。我想知道在不使用模块的情况下这是否也是可行的,但是对于当前的实现,它是模块化的

使用此当前代码,将显示带有按钮的菜单栏,但不会显示登录视图

主模块 App.xaml.cs

protected override Window CreateShell()
        {
           return Container.Resolve<MainWindow>();
        }

protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }

protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            moduleCatalog.AddModule<LoginModule.ModuleLoginModule>();
        }
登录模块 ModuleLoginModule.cs:

namespace LoginModule 
{
    public class ModuleLoginModule : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {
            var regionManager = containerProvider.Resolve<IRegionManager>();
            regionManager.RegisterViewWithRegion("LoginRegion", typeof(Login));
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<Login>();
        }
    }
}
命名空间登录模块
{
公共类模块登录模块:IModule
{
初始公共无效(IContainerProvider-containerProvider)
{
var regionManager=containerProvider.Resolve();
regionManager.RegisterViewWithRegion(“LoginRegion”,typeof(Login));
}
公共无效注册表类型(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation();
}
}
}
Login.xaml:

<UserControl x:Class="LoginModule.Views.Login"
             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:LoginModule.Views"
             xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid Background="White" prism:RegionManager.RegionName="LoginRegion">
        <StackPanel Panel.ZIndex="1" Margin="150">
            <TextBox HorizontalAlignment="Center" VerticalAlignment="Center">Text</TextBox>
            <PasswordBox HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <Button Background="LightBlue" Content="Login" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </StackPanel>

        <Rectangle Panel.ZIndex="0" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="LightGray" Height="300" Width="400" />
    </Grid>
</UserControl>


正文
我想知道,如果不使用模块,这是否也是可能的

当然是这样。模块是完全可选的,如果您愿意,您可以从引导程序/
PrismApplication
进行所有注册

像这样的事情没有什么错:

public class MyApplication : PrismApplication
{
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<Login>();
    }
}

internal class MainWindowViewModel
{
    public MainWindowViewModel( IRegionManager regionManager )
    {
        regionManager.RequestNavigate( "ContentRegion", "Login" );
    }
}
公共类MyApplication:PrismApplication
{
受保护的覆盖无效注册表类型(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation();
}
}
内部类MainWindowViewModel
{
公共主窗口视图模型(IRegionManager regionManager)
{
RequestNavigate(“ContentRegion”、“Login”);
}
}
我想知道,如果不使用模块,这是否也是可能的

当然是这样。模块是完全可选的,如果您愿意,您可以从引导程序/
PrismApplication
进行所有注册

像这样的事情没有什么错:

public class MyApplication : PrismApplication
{
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<Login>();
    }
}

internal class MainWindowViewModel
{
    public MainWindowViewModel( IRegionManager regionManager )
    {
        regionManager.RequestNavigate( "ContentRegion", "Login" );
    }
}
公共类MyApplication:PrismApplication
{
受保护的覆盖无效注册表类型(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation();
}
}
内部类MainWindowViewModel
{
公共主窗口视图模型(IRegionManager regionManager)
{
RequestNavigate(“ContentRegion”、“Login”);
}
}

你好,豪金!谢谢你的回复。我创建了一个新的应用程序,只是为了了解它的基本工作原理,我在
PrismApplication
中注册了类型。我所拥有的只是一个按钮,可以在
MainWindow.xaml
中导航到一个新视图。问题是,当我单击按钮导航到新视图时,没有显示新视图,什么也没有发生。有什么想法吗?你有所有的注册吗?导航请求提供的结果是什么?嗨,Haukinger!谢谢你的回复。我创建了一个新的应用程序,只是为了了解它的基本工作原理,我在
PrismApplication
中注册了类型。我所拥有的只是一个按钮,可以在
MainWindow.xaml
中导航到一个新视图。问题是,当我单击按钮导航到新视图时,没有显示新视图,什么也没有发生。有什么想法吗?你有所有的注册吗?导航请求提供的结果是什么?
public class MyApplication : PrismApplication
{
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<Login>();
    }
}

internal class MainWindowViewModel
{
    public MainWindowViewModel( IRegionManager regionManager )
    {
        regionManager.RequestNavigate( "ContentRegion", "Login" );
    }
}