创建弹出窗口时PRISM区域消失

时间:2015-12-11 19:02:50

标签: c# wpf popup prism region

我有一个包含另一个Region的Region的PopUp。通过WPF Prism(MEF)InteractionRequest方法调用此弹出窗口。结构如下:

PopUpUserControl
  - ContentControl : Region(UserCatalogsCreateRegion)
     - PopUpStageUserControl
       - StackPanel 
          -ContentControl : Region(UserCatalogsCreateStackRegion) <--Disappearing Region

问题表现在这样。当应用程序启动并正常运行时,我可以列出应用程序中的Regions,我可以看到RegionManager包含名为&#34; UserCatalogsCreateStackRegion&#34;的区域。

现在,当我单击为PopUpCreation设置InteractionRequest的按钮时,我可以看到Regions列表不再包含&#34; UserCatalogsCreateStackRegion&#34;。我验证了某些内容正在删除我的Region,因为我在RegionManager的Regions属性中添加了一个CollectionListener,并且一旦创建了Popup,我的断点就被命中,Notif..Action是&#34;删除&#34;而OldItem是有问题的区域。

TL;当创建并调用包含所述Region的弹出窗口时,DR Region将从RegionManager.Regions中消失。

非常感谢任何帮助。我将尝试回答尽可能多的其他问题,因为区域经理可能会出现问题。

修改

Brian Lagunas&#39;链接指向了doggone解决方案。这是解决方案。我对PopUpStageControl的最终工作代码如下所示,其中ContentControl是保持&#34;消失的区域&#34;:

    [ImportingConstructor]
    public PopUpStageUserControl(IRegionManager regionManager)
    {
        InitializeComponent();
        this.regionManager = regionManager;

        //Fix Begin
        RegionManager.SetRegionName(ContentControl, AppRegions.UserCatalogsCreateStackRegion);
        RegionManager.SetRegionManager(ContentControl, regionManager);
        //Fix End

        RegionManager.SetRegionManager(this, regionManager);
        RegionManager.UpdateRegions();
    }

3 个答案:

答案 0 :(得分:2)

这是因为弹出窗口不是可视树的一部分,因此区域管理器将无法找到该区域。您必须手动注册该区域。见这些帖子:

Region not loaded by the RegionManger

How to register regions inside user controls or control templates in RegionManager?

PRISM 6 Regions in WPF using DataTemplate/CustomControl

https://github.com/PrismLibrary/Prism/issues/251

答案 1 :(得分:0)

取消我的评论,然后快速推出Google result(旧版PRISM)。

  

IRegionMemberLifetime接口:另请注意,ModuleARibbonTab类实现了IRegionMemberLifetime接口。此接口由Prism提供,它控制当用户离开视图时是否从区域中删除视图。

根据它的声音,您可能希望实施IRegionMemberLifetime并相应地设置KeepAlive,这可能会影响RegionManager何时删除/保留该区域。

答案 2 :(得分:0)

虽然您没有在发布的代码中说明,但我认为您在设置InteractionRequest时使用的是这样的内容:

<prism:PopupWindowAction.WindowContent>
    <inf:PopUpStageUserControl/>
</prism:PopupWindowAction.WindowContent>

所以你必须要知道,在运行时Prism会用你在PopupWindowAction.WindowContent中指定的内容替换所有弹出内容。