【问题标题】:Prism - region.add and regionManager.AddToRegion works differently棱镜 - region.add 和 regionManager.AddToRegion 的工作方式不同
【发布时间】:2016-06-10 07:59:10
【问题描述】:

我的印象是以下两个代码语句是类似的

var region = regionManager.Region["SomeRegion"]
region.Add(container.Resolve<SomeView>());

regionManager.AddToRegion("SomeRegion", container.Resolve<SomeView>());

但如in my project 所示,它们都产生不同的结果 - 令我惊讶的是,使用 regionManager.AddToRegion 不需要使用 Scoped Regions,但使用 region.Add 我们需要使用 scoped Regions。

clone the repo,构建并运行项目,您应该会收到一个异常,即 ViewB 已注册。现在打开 TestModule.cs(见下文)并注释“region.add”行,然后取消注释 regionManager.AddToRegion,您将看到解决方案完美运行。

我浏览了文档并看到项目间歇性地使用 region.Add 和 regionManager.AddToRegion,但似乎 API 的工作方式有所不同。

https://github.com/rohits79/PrismRegionAmbiguity/blob/master/TestModule/TestModule.cs#L22-29

更新

注意到如果我添加三行 AddToRegion 则应用程序崩溃

regionManager.AddToRegion("ViewA", unityContainer.Resolve<ViewA>());

不过只需要两行

region.Add(container.Resolve<ViewA>());

这在 Prism 中看起来不是问题吗,想知道为什么 AddToRegion 可以在不创建范围的情况下工作吗?

【问题讨论】:

    标签: c# wpf prism prism-5


    【解决方案1】:

    我以前见过这种情况。我从来没有花时间去研究它,因为这没什么大不了的。 AddToRegion 实际上调用了 Region.Add,所以我不确定为什么会突然发生这种情况。我认为这取决于 Region 类型,因为调用 region.Actiavte 会立即调用错误。

    请注意,如果您有一个区域的多个实例,则必须始终使用作用域区域。

    【讨论】:

    • 是的,事实上这很奇怪,我会试一试。我可以一直追踪到 RegionManagerRegistrationBehavior,我们第二次通过视图发现添加视图时,它没有注册区域,但是第三次​​它注册并抛出异常。对我来说它看起来像一个错误,你认为我应该打开一张票吗(抱歉我交叉发布它,因为我认为这是一个错误)。不过现在我将停止使用 AddToRegion。
    猜你喜欢
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2019-04-03
    相关资源
    最近更新 更多