Prism Regions UpdateRegionsException

时间:2016-01-05 13:01:54

标签: wpf prism-5

我有一个应用程序,它使用区域管理器注册2个区域,1是内容控件,另一个是自定义控件。在我尝试使用RDP会话之前,两者都可以运行应用程序。如果我断开与运行应用程序的远程计算机的连接,然后将RDP与正在运行的应用程序重新连接,我得到一个例外,即自定义控件已经注册。两者都将RegionMeneberLifetime设置为false。

内容控件首先添加为

<ContentControl x:Name="MainRegion" Panel.ZIndex="0"
regions:RegionManager.RegionName="{x:Static sharedInterfaces:RegionNames.MainWorkspaceRegion}"
regions:RegionManager.RegionManager="{Binding RegionManager}"/>

然后是自定义控件

<controls:PopUpContainer regions:RegionManager.RegionName="{x:Static sharedInterfaces:RegionNames.PopupRegion}" 
                                 regions:RegionManager.RegionManager="{Binding RegionManager}"/>

自定义控件继承自ContentControl。

抛出的异常是

消息:创建名为“MainWorkspaceRegion”的区域时发生异常。例外情况是:Microsoft.Practices.Prism.Regions.UpdateRegionsException:尝试创建区域对象时发生异常。      - 最可能导致异常的是:'System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---&GT; Microsoft.Practices.Prism.Regions.Behaviors.RegionCreationException:创建名为“PopupRegion”的区域时发生异常。例外情况是:System.ArgumentException:具有给定名称的区域已经注册:PopupRegion

看起来popupregion尚未被处理,并且在尝试再次添加它时会爆炸。关于我如何处理这个问题的任何建议?

2 个答案:

答案 0 :(得分:3)

要添加

regions:RegionManager.RegionName="{x:Static sharedInterfaces:RegionNames.PopupRegion}

在整个应用程序中只有一次。

如果您有2个同名的地区,您将获得此例外。

(我没有足够的评论声誉)

答案 1 :(得分:0)

找到了解决方法。 视图不会在区域管理器中注册控件,而是在后面的代码中完成。

视图添加控件并为其指定名称

<ContentControl x:Name="MainRegion" Panel.ZIndex="0"/>
<controls:PopUpContainer x:Name="PopupControl" Grid.ColumnSpan="2"/>

当发生datacontext更改事件时,后面的代码会添加区域

private void ShellView_OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var dataContext = DataContext as ShellViewModel;

        if (dataContext != null)
        {
            if (dataContext.RegionManager.Regions.ContainsRegionWithName(RegionNames.PopupRegion))
            {
                dataContext.RegionManager.Regions.Remove(RegionNames.PopupRegion);
            }

            RegionManager.SetRegionName(PopupControl, RegionNames.PopupRegion);
            RegionManager.SetRegionManager(PopupControl, dataContext.RegionManager);


            if (dataContext.RegionManager.Regions.ContainsRegionWithName(RegionNames.MainWorkspaceRegion))
            {
                dataContext.RegionManager.Regions.Remove(RegionNames.MainWorkspaceRegion);
            }

            RegionManager.SetRegionName(MainRegion, RegionNames.MainWorkspaceRegion);
            RegionManager.SetRegionManager(MainRegion, dataContext.RegionManager);

        }

}