在Prism中,注册区域和添加区域之间有什么区别?

6
我希望你能够创建一个可以动态查看的区域(一个区域中包含多个视图)。这个区域的内容需要通过下拉框选择事件进行更改(下拉框的选项是视图实例)。我希望当下拉框发生变化时,所选视图项目将会在区域中更改显示的视图。
我的问题是:下面两种方式之间有什么区别:
MyView view= new MyView();
IRegion region = new Region();  
region.Name="MyRegion";  
regionManager.Regions.Add(region);
region.Add(view);
region.Activate(view);

致:

regionManager.RegisterViewWithRegion("MyRegion",type(MyView));

如何最佳使用动态区域?


有人能帮忙吗?我真的需要解决它。我需要使用现有的视图而不是重新创建它们。这就是我需要使用第一个过程的原因... - user436862
在重复使用视图时要非常小心。单个视图实例只能在可视树中存在一次。你正在使用MEF吗? - Gusdor
4个回答

4
如果您希望在同一区域中显示不同的视图,则需要使用RequestNavigate或您在第一个方法中使用的视图注入。使用RegisterViewWithRegion将区域与视图相关联,以便每当托管区域的控件成为可视树的一部分时,视图会自动解析和显示。有关更多信息,请参见msdn

4
直接添加控件实例被称为视图注入。 注册视图类型称为视图发现。
为什么是发现?因为Prism使用当前的ServiceLocator从容器(MEF、Unity或您选择的其他容器)中获取实例,然后自动添加视图。
发现更加简洁,因为所有视图都是惰性创建的(只有在需要它们时才会创建)。注入允许您进行一些高级组合(例如作用域区域),但您需要更多的操作。
没有正确的答案,但对于学习prism,我会选择视图发现(RegisterViewWithRegion)。为了获得最佳效果,请使用常量来保存您的区域名称!

1
你是否使用容器来注入实例?根据我的理解,如果在相关的视图类型上配置了Singleton注册,则这两个过程都将返回现有的View。您可以在以下MSDN Prism Guide章节中找到更多信息: 关于这两种实现,RegisterViewWithRegion()方法与第一种实现非常相似:它基本上从容器中加载并添加ViewRegion中,并将其激活。因此,在每次初始化完成后,使用此方法在Region中注册的最后一个View将是活动的。您可以在PrismLibrary解决方案中检查此行为。

就像Jimmy所说的那样,你描述的代码仅用于使用相应的视图加载每个区域。然后,您将使用RequestNavigate()方法来激活已在区域上注册的所选视图

您可以在以下MSDN Prism Guide章节中找到更多相关信息:

希望这能有所帮助,问候。


0

第一次看到:

type(MyView)

也许应该是:

typeof(MyView)

??


1
我建议只有在你确信答案时才回答。快速的谷歌搜索可以帮助你揭示哪一个是正确的。此外,解释你的建议以及他们如何在自己的上下文中使用它。 - SEoF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接