2

我有一个应用程序向区域管理器注册 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:调用的目标已抛出异常。---> Microsoft.Practices.Prism.Regions.Behaviors.RegionCreationException:创建名为“PopupRegion”的区域时发生异常。例外是:System.ArgumentException:具有给定名称的区域已注册:PopupRegion

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

4

2 回答 2

4

一定要添加

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

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

如果您有 2 个同名区域,您将收到此异常。

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

于 2016-01-12T17:02:16.907 回答
2

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

视图添加控件并为其命名

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

当数据上下文更改事件发生时,后面的代码会添加区域

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);
    }
}
于 2016-01-07T16:53:08.017 回答