我有一个应用程序,它使用区域管理器注册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尚未被处理,并且在尝试再次添加它时会爆炸。关于我如何处理这个问题的任何建议?
答案 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);
}
}