如何在程序启动时通过视图模型将视图注入区域
How to inject a view into a region via view model at program start
我正在创建一个 WPF MVVM Prism 应用程序,我需要在一个区域内的视图之间切换,这是我通过视图注入实现的。我像这样在 MainWindow.xaml
中实例化区域:
<ContentControl prism:RegionManager.RegionName="ContentRegion" />
以后用命令改变视图是没有问题的。问题是我需要程序开始时的区域才能从头开始显示视图。当我把它放在构造函数中时,比如
public MainWindowViewModel(IContainerExtension container, IRegionManager regionManager)
{
_regionManager = regionManager;
_container = container;
_view1 = _container.Resolve<1Control>();
_view2 = _container.Resolve<2Control>();
_contentregion = _regionManager.Regions["ContentRegion"];
_contentregion.Add(_view1);
_contentregion.Add(_view1);
}
我收到 RegionManager
不包含 ContentRegion
的错误。之所以会这样,是因为当时还没有从 XAML 实例化。我不能像 here 那样使用主 window 和 Loaded
事件,因为我需要在视图模型中而不是在代码隐藏中进行。以某种方式设置默认视图(可能在 XAML 中?)然后稍后使用命令更改活动视图也足够了,但我也不知道它是如何工作的。
如果您想要视图注入或使用导航框架并需要设置初始视图,您可以通过覆盖 [=22] 中的 OnInitialized
使用 Prism 应用程序中的区域管理器注入或导航到它=]App.xaml.cs。
首先调用 base.OnInitialized();
很重要,因为它会在 shell window 上调用 Show()
。因此,在这个调用之后 shell 视图被初始化并且区域管理器知道它的区域。
public partial class App : PrismApplication
{
// ...bootstrapping code.
protected override void OnInitialized()
{
base.OnInitialized();
var regionManager = Container.Resolve<IRegionManager>();
var contentRegion = regionManager.Regions["ContentRegion"];
var view1 = Container.Resolve<Control1>();
var view2 = Container.Resolve<Control2>();
contentRegion.Add(view1);
contentRegion.Add(view1);
}
}
另一种方法是使用 view discovery 而不是 view injection,您可以使用RegisterViewWithRegion
方法。在 App.xaml.cs 中的 Prism 应用程序中,您可以在 CreateShell
或 OnInitialized
等不同的地方执行此操作,因为此方法仅 用区域注册视图。当区域可用并显示视图时,它将在稍后实例化。 Prism 将自动创建视图并将其加载到区域中。
protected override void OnInitialized()
{
var regionManager = Container.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(Control1));
regionManager.RegisterViewWithRegion("ContentRegion", typeof(Control2));
}
我正在创建一个 WPF MVVM Prism 应用程序,我需要在一个区域内的视图之间切换,这是我通过视图注入实现的。我像这样在 MainWindow.xaml
中实例化区域:
<ContentControl prism:RegionManager.RegionName="ContentRegion" />
以后用命令改变视图是没有问题的。问题是我需要程序开始时的区域才能从头开始显示视图。当我把它放在构造函数中时,比如
public MainWindowViewModel(IContainerExtension container, IRegionManager regionManager)
{
_regionManager = regionManager;
_container = container;
_view1 = _container.Resolve<1Control>();
_view2 = _container.Resolve<2Control>();
_contentregion = _regionManager.Regions["ContentRegion"];
_contentregion.Add(_view1);
_contentregion.Add(_view1);
}
我收到 RegionManager
不包含 ContentRegion
的错误。之所以会这样,是因为当时还没有从 XAML 实例化。我不能像 here 那样使用主 window 和 Loaded
事件,因为我需要在视图模型中而不是在代码隐藏中进行。以某种方式设置默认视图(可能在 XAML 中?)然后稍后使用命令更改活动视图也足够了,但我也不知道它是如何工作的。
如果您想要视图注入或使用导航框架并需要设置初始视图,您可以通过覆盖 [=22] 中的 OnInitialized
使用 Prism 应用程序中的区域管理器注入或导航到它=]App.xaml.cs。
首先调用 base.OnInitialized();
很重要,因为它会在 shell window 上调用 Show()
。因此,在这个调用之后 shell 视图被初始化并且区域管理器知道它的区域。
public partial class App : PrismApplication
{
// ...bootstrapping code.
protected override void OnInitialized()
{
base.OnInitialized();
var regionManager = Container.Resolve<IRegionManager>();
var contentRegion = regionManager.Regions["ContentRegion"];
var view1 = Container.Resolve<Control1>();
var view2 = Container.Resolve<Control2>();
contentRegion.Add(view1);
contentRegion.Add(view1);
}
}
另一种方法是使用 view discovery 而不是 view injection,您可以使用RegisterViewWithRegion
方法。在 App.xaml.cs 中的 Prism 应用程序中,您可以在 CreateShell
或 OnInitialized
等不同的地方执行此操作,因为此方法仅 用区域注册视图。当区域可用并显示视图时,它将在稍后实例化。 Prism 将自动创建视图并将其加载到区域中。
protected override void OnInitialized()
{
var regionManager = Container.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(Control1));
regionManager.RegisterViewWithRegion("ContentRegion", typeof(Control2));
}