区域激活和区域RequestNavigate有什么区别?

use*_*862 5 c# wpf prism mvvm region

我使用一个有2个视图的区域.我有一个ComboBox允许用户选择区域中的视图.

我有两个问题:

第一个问题是:有什么区别:

_regionManager.Regions.Add("MyRegion")
_regionManager.Regions["MyRegion"].Add(container.Resolve<OneView>())
_regionManager.Regions["MyRegion"].Add(container.Resolve<SecondView>())
Run Code Online (Sandbox Code Playgroud)

至:

_regionManager.RegisterViewWithRegion("MyRegion", () => container.Resolve<OneView>());
_regionManager.RegisterViewWithRegion("MyRegion", () => container.Resolve<SecondView>());
Run Code Online (Sandbox Code Playgroud)

我的第二个问题是:有什么区别:

_regionManager.Regions["MyRegion"].ActiveViews.ForEach(view => _region.Deactivate(view));
_regionManager.Regions["MyRegion"].Activate(container.Resolve<SecondView>());
Run Code Online (Sandbox Code Playgroud)

至:

_regionManager.Regions["MyRegion"].RequestNavigate(new Uri("SecondView", UriKind.Relative));
Run Code Online (Sandbox Code Playgroud)

提前致谢.

GOs*_*sky 7

您提到的第一个比较的差异在于RegisterViewWithRegion()方法在进程结束时激活已注册的View,而第一个实现仅添加Views.这种RegisterViewWithRegion()方法称为View Discovery.您可能会在昨天发表的以下帖子中找到相关答案:

有关MSDN Prism指南的有用信息:

对于第二次比较,它将取决于Region类型.第一个实现只会激活SecondView.但是,如果RegionItemsControl类型,则RequestNavigate()可能不会停用上一个View.一个ItemsControl的地区,您可以添加很多意见,所以你可以有不止一个活动视图.

如果是这样的情况下,SecondView会出现下面的以前的活动视图地区.但如果您不想要这种行为,您有两个选择:

  1. Region类型设置为ContentControl,因此一次只显示一个View;
  2. OnNavigatedFrom()方法中停用上一个View.您需要使之前的View继承自INavigationAware.

有关MSDN Prism Guide上的RequestNavigate()导航的有用信息:

我希望这会有所帮助,问候.