我有一个视图让我们称它为'NestedView',它定义了嵌套区域,由于缺少XAML中的嵌套区域支持,我在UserControl构造函数中创建一个视图,如下所示:
RegionManager.SetRegionName(RegionControl, "MyRegionName");
RegionManager.SetRegionManager(RegionControl, _globalRegionManager);
'NestedView'显示(添加)到某个区域让我们称之为'MainRegion',有时我需要关闭此视图(从'MainRegion'中删除它)。但是,如果我只是从'MainRegion'中删除'NestedView',它注册的区域'MyRegionName'将保持注册状态,下次我将尝试打开'NestedView'时,它将抛出区域'MeregionName'已经注册的异常。 / p>
所以我需要确保当我关闭包含区域的视图时,它们是未注册的,并且它们包含的所有视图都被处理掉了。这样做的最佳方式是什么?
答案 0 :(得分:0)
我在NavigationService中提出了这个方法:
public interface IRegionContainer
{
IEnumerable<String> RegionNames { get; }
}
public void RequestClose(string regionName, string viewContract)
{
ContainerRegistration registration = _unityContainer.Registrations.SingleOrDefault(t => t.Name == viewContract);
if (registration == null) throw new Exception("ViewContract is not registered");
IEnumerable<object> candidateViews = _regionManager.Regions[regionName].Views.Where(t => t.GetType() == registration.MappedToType);
foreach (object viewInstance in candidateViews)
{
var regionContainer = viewInstance as IRegionContainer;
if (regionContainer != null) //View defines regions?
{
foreach (string rName in regionContainer.RegionNames)
{
var success = _regionManager.Regions.Remove(rName);
if (success == false) throw new Exception("Can't remove region: " + rName);
}
}
_regionManager.Regions[regionName].Remove(viewInstance);
}
}
此外,PRISM 4.1已经出局,他们声称要解决这个问题。