【问题标题】:Load Region On Application Startup在应用程序启动时加载区域
【发布时间】:2019-06-01 16:43:05
【问题描述】:

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

使用当前代码,显示带有按钮的菜单栏,但不显示 Login 视图。

主模块

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>();
        }

MainWindow.xaml:

<Window x:Class="PrismMVVM.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        xmlns:local="clr-namespace:PrismMVVM"
        mc:Ignorable="d"

        Title="PrismMVVM" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="10*"/>
        </Grid.RowDefinitions>
        <DockPanel Grid.Row="0">
            <Button Content="Code is Poetry" HorizontalAlignment="Left" Width="Auto"/>
        </DockPanel>
        <ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion">
        </ContentControl>
    </Grid>
</Window>

MainWindowViewModel.cs

namespace PrismMVVM.ViewModels 
{
    class MainWindowViewModel : BindableBase
    {
        public IRegionManager _regionManager;
        public MainWindowViewModel(IRegionManager regionManager)
        {
            _regionManager = regionManager;
            regionManager.RequestNavigate("LoginRegion", "Login");
        }
    }
}

登录模块

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>();
        }
    }
}

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>

【问题讨论】:

    标签: c# wpf prism


    【解决方案1】:

    我想知道不使用模块是否也可以这样做

    确实如此。模块是完全可选的,如果您愿意,您可以从引导程序 /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" );
        }
    }
    

    【讨论】:

    • 你好豪金格!感谢您的回复。我创建了一个新应用程序只是为了了解它的工作原理,并且我在PrismApplication 中进行了类型注册。我所拥有的只是一个导航到MainWindow.xaml 中的新视图的按钮。问题是,当我单击按钮导航到新视图而不是显示新视图时,什么也没有发生。有什么想法吗?
    • 您是否已完成所有注册?导航请求提供的结果是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多