C# Prism WPF:启动时加载用户控件

C# Prism WPF:启动时加载用户控件,c#,wpf,mvvm,prism,C#,Wpf,Mvvm,Prism,我已经看到了一些使用Prism for WPF在一个窗口中更改用户控件的示例,它如下所示: Bootstrapper.cs protected override void ConfigureContainer() { base.ConfigureContainer(); Container.RegisterType(typeof(object), typeof(ViewA), "ViewA"); Container.Registe

我已经看到了一些使用Prism for WPF在一个窗口中更改用户控件的示例,它如下所示:

Bootstrapper.cs

    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();

        Container.RegisterType(typeof(object), typeof(ViewA), "ViewA");
        Container.RegisterType(typeof(object), typeof(ViewB), "ViewB");
    }
    public class MainWindowViewModel : BindableBase
    {
        private readonly IRegionManager _regionManager;

        public DelegateCommand<string> NavigateCommand;


        public MainWindowViewModel(IRegionManager regionManager)
        {
            _regionManager = regionManager;

            NavigateCommand = new DelegateCommand<string>(ExecuteNavigateCommand);
        }

        private void ExecuteNavigateCommand(string uri)
        {
            _regionManager.RequestNavigate("ContentRegion", uri);
        }
    }
MainWindowViewModel.cs

    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();

        Container.RegisterType(typeof(object), typeof(ViewA), "ViewA");
        Container.RegisterType(typeof(object), typeof(ViewB), "ViewB");
    }
    public class MainWindowViewModel : BindableBase
    {
        private readonly IRegionManager _regionManager;

        public DelegateCommand<string> NavigateCommand;


        public MainWindowViewModel(IRegionManager regionManager)
        {
            _regionManager = regionManager;

            NavigateCommand = new DelegateCommand<string>(ExecuteNavigateCommand);
        }

        private void ExecuteNavigateCommand(string uri)
        {
            _regionManager.RequestNavigate("ContentRegion", uri);
        }
    }
公共类MainWindowViewModel:BindableBase { 私有只读IRegionManager _regionManager; 公共DelegateCommand导航命令; 公共主窗口视图模型(IRegionManager regionManager) { _regionManager=regionManager; NavigateCommand=新的DelegateCommand(ExecuteNavigateCommand); } 私有void executenavigate命令(字符串uri) { _RequestNavigate(“ContentRegion”,uri); } } main window.xaml

<Button Grid.Row="1" Grid.Column="1" Command="{Binding NavigateCommand}" CommandParameter="ViewA" FontSize="16" Content="View A" Margin="4"/>
<Button Grid.Row="1" Grid.Column="2" Command="{Binding NavigateCommand}" CommandParameter="ViewB" FontSize="16" Content="View B" Margin="4"/>


您可以单击它,视图将更改。但是当您启动它时,没有加载任何用户控件,只有主窗口。我的问题是如何在应用程序启动时将用户控件加载到主窗口?

您在这里有不同的选项。首先,注册该区域的视图,以便自动发现和显示该区域。如果您不想在以后导航到该视图,则可以使用该方法

_regionManager.RegisterViewWithRegion("MyRegion", typeof(ViewA));
或者,当应用程序启动完成时,您可以导航到该视图。也就是说,从
Bootstrapper.InitializeModules
的末尾开始。如果引导程序不知道该视图,或者此时您也想做其他事情,您也可以发布类似
moduleInitialized
的事件,并让定义视图的模块订阅该事件

// in the assembly defining the interfaces shared between your modules
public class ModulesInitialized : PubSubEvent {}

// in the bootstrapper.InitializeModules
Container.Resolve<IEventAggregator>().GetEvent<ModulesInitialized>().Publish();

// in the module defining viewA
_eventAggregator.GetEvent<ModulesInitialized>().Subscribe( () => _regionManager.Requestnavigate( "MyRegion", "ViewA" ), true );
//在定义模块间共享接口的程序集中
公共类模块初始化:PubSubEvent{}
//在bootstrapper.initializeModule中
Container.Resolve().GetEvent().Publish();
//在定义viewA的模块中
_eventAggregator.GetEvent().Subscribe(()=>_regionManager.Requestnavigate(“MyRegion”、“ViewA”),true);

我尝试了第一个选项,可惜它只显示视图,不关心视图模型(除非在代码隐藏中指定数据上下文)。还有其他建议吗?在xaml中使用
ViewModelLocator.AutoWireViewModel=True
首先使用view时,它会自动解析视图模型实例并将其指定为数据上下文。如果您不想在以后导航到该视图,那么这句话的含义是什么?我感兴趣的是进入
RegisterViewWithRegions
路径在区域中注册视图并不会隐式注册它以进行导航,据我所知。当然你也可以注册导航。