Prism WPF:在启动时加载用户控件
Prism WPF: Loading a User Control on Startup
我只在一个 window 中看到了一些关于使用 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");
}
MainWindowViewModel.cs
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);
}
}
MainWindow.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"/>
您可以点击它,视图会发生变化。但是当你启动它时,并没有加载用户控件,只有主要的window。我的问题是 如何在应用程序启动时将用户控件加载到主窗口?
您在这里有不同的选择。首先,注册该区域的视图,以便自动发现和显示。如果您之后不想导航到该视图,这会起作用。
_regionManager.RegisterViewWithRegion("MyRegion", typeof(ViewA));
或者,您可以在应用程序完成启动后导航到视图。也就是从Bootstrapper.InitializeModules
开始。如果引导程序不知道该视图,或者您此时也想做其他事情,您也可以发布一个事件,例如 ModulesInitialized
并让定义您的视图的模块订阅该事件。
// 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 );
我只在一个 window 中看到了一些关于使用 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");
}
MainWindowViewModel.cs
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);
}
}
MainWindow.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"/>
您可以点击它,视图会发生变化。但是当你启动它时,并没有加载用户控件,只有主要的window。我的问题是 如何在应用程序启动时将用户控件加载到主窗口?
您在这里有不同的选择。首先,注册该区域的视图,以便自动发现和显示。如果您之后不想导航到该视图,这会起作用。
_regionManager.RegisterViewWithRegion("MyRegion", typeof(ViewA));
或者,您可以在应用程序完成启动后导航到视图。也就是从Bootstrapper.InitializeModules
开始。如果引导程序不知道该视图,或者您此时也想做其他事情,您也可以发布一个事件,例如 ModulesInitialized
并让定义您的视图的模块订阅该事件。
// 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 );