WPF Prism - 是否使用Scoped Regions?

时间:2009-10-05 14:56:54

标签: wpf prism region

我有一个基于Prism 2009年2月发布的WPF项目设置为:

Shell将单个ContentControl公开为“MainRegion” 基础结构项目中定义的另一个视图(用户控件)名为SplitView,它还将两个附加区域“LeftRegion”和“RightRegion”公开为ContentControl。

我的一些应用程序模块需要在MainRegion(一个用户控件)中显示其视图,而其他模块需要在LeftRegion和RightRegion中显示其视图(两个用户控件以分割方式)。

我尝试使用作用域区域,假设特定的控制器将保留对作用域区域的引用。所以基本上每个对SplitView功能感兴趣的控制器都应该实例化一个新的SplitView(用户控件)并在MainRegion中激活它,同时在新创建的范围的 SplitView区域的LeftRegion和RightRegion中激活它的两个用户控件。 / p>

我正在使用MVVM和View Injection来显示视图。

毋庸置疑,这种做法出现了严重错误。

在运行时,我得到此异常,“创建名为'LeftRegion'的区域时发生异常。例外是:System.InvalidOperationException:指定的元素已经是另一个元素的逻辑子元素。首先断开它。”

我是否正确假设每次实例化SplitView时LeftRegion和RightRegion都尝试使用主RegionManager注册自己?

对于令人困惑/冗长的帖子感到抱歉。有什么建议?实现这一目标的最佳实践?

提前致谢,

阿里

1 个答案:

答案 0 :(得分:2)

“指定元素已经是逻辑子元素”的例外是当你尝试在树中的两个地方添加内容时会发生什么,所以我想你的代码中可能存在一些逻辑错误,或者你是添加两次。

我通常会像这样创建我的子区域:

    m_scopedRegionName = Guid.NewGuid().ToString(); /* EXAMPLE ! */
    m_scopedRegionManager =  m_regionManager.Regions[RegionNames.WORKSPACE_REGION].Add(myViewModel.View, m_scopedRegionName, true);
    m_someThingRegion = m_scopedRegionManager.Regions[RegionNames.SOME_THING_REGION];

然后我将任何新内容添加到“m_someThingRegion”中。