【问题标题】:WPF Prism - To use Scoped Regions or not?WPF Prism - 是否使用范围区域?
【发布时间】:2010-12-03 23:38:08
【问题描述】:

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

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

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

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

我正在使用带有视图注入的 MVVM 来显示视图。

不用说,这种方法出现了严重错误。

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

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

对于令人困惑/冗长的帖子,我们深表歉意。有什么建议?实现这一目标的最佳做法?

提前致谢,

阿里

【问题讨论】:

  • 我认为您将不得不在那里发布一些代码。我已经重读了几次你的帖子,但我不是 100% 了解你想要做什么。
  • Anderson,基本上我要做的是多次实例化一个视图(SplitView),并且该视图定义了自己的区域(两个 ContentControl 区域,名为“LeftRegion”和“RightRegion”)。如果还不清楚,我可以发布一些代码。谢谢。

标签: wpf prism region


【解决方案1】:

“指定元素已经是逻辑子元素...”的例外是当您尝试将某些内容添加到树中的两个位置时会发生这种情况,所以我想您的代码中可能存在一些逻辑错误,或者您是添加两次。

我通常这样创建子区域:

    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”中。

【讨论】:

  • 耶利米,我正在做类似的事情。只是在我的情况下,“myViewModel.View”被多次实例化。那是我犯的错误吗?定义自己的区域的视图是否允许多个实例化?
  • 当然,您可以为包含区域的视图创建多个实例化,但在这种情况下,需要将它们添加到自己的作用域区域中。确保在添加到区域时实例化新视图,否则您将获得 WPF 异常。
  • 这正是我所犯的错误。我没有在它们自己的范围区域中创建额外的视图实例。我基本上已经将视图添加到我的 MainRegion 范围区域中。感谢您的澄清,该解决方案现在可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2023-03-25
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多