我使用一个有2个视图的区域.我有一个ComboBox,让用户可以选择区域中的视图.
我有两个问题:
第一个问题是:有什么区别:
_regionManager.Regions.Add("MyRegion")
_regionManager.Regions["MyRegion"].Add(container.Resolve<OneView>())
_regionManager.Regions["MyRegion"].Add(container.Resolve<SecondView>())
至:
_regionManager.RegisterViewWithRegion("MyRegion", () => container.Resolve<OneView>());
_regionManager.RegisterViewWithRegion("MyRegion", () => container.Resolve<SecondView>());
我的第二个问题是:有什么区别:
_regionManager.Regions["MyRegion"].ActiveViews.ForEach(view => _region.Deactivate(view));
_regionManager.Regions["MyRegion"].Activate(container.Resolve<SecondView>());
至:
_regionManager.Regions["MyRegion"].RequestNavigate(new Uri("SecondView", UriKind.Relative));
提前致谢.
解决方法:
您提到的第一个比较的差异在于RegisterViewWithRegion()方法在进程结束时激活已注册的View,而第一个实现仅添加Views.
这种RegisterViewWithRegion()方法称为View Discovery.您可能会在昨天发表的以下帖子中找到相关答案:
> What is the difference between register a region to adding a region in prism?
有关MSDN Prism指南的有用信息:
> Composing the User Interface
对于第二次比较,它将取决于Region类型.第一个实现只会激活SecondView.但是,如果Region是ItemsControl类型,则RequestNavigate()可能不会停用上一个View. ItemsControl Region允许您附加许多视图,因此您可以拥有多个活动视图.
如果是这种情况,则SecondView将显示在区域中先前活动的视图下方.但如果您不想要这种行为,您有两个选择:
>将Region类型设置为ContentControl,因此一次只能显示一个View;
>取消激活OnNavigatedFrom()方法中的上一个视图.您需要使之前的View继承自INavigationAware.
有关MSDN Prism Guide上的RequestNavigate()和导航的有用信息:
我希望这会有所帮助,问候.