Prism:区域停用时的InvalidOperationException.在这种类型的区域中不可能取消激活

本文关键字:区域 种类 类型 不可能 激活 取消 InvalidOperationException Prism | 更新日期: 2023-09-27 18:06:39

我正在使用PRISM 5.0开发一个WPF应用程序。

在某些时候,我想取消激活特定区域的所有活动视图。

IRegion contentRegion = _regionManager.Regions
    .First(region => region.Name == RegionNames.ContentRegion);
foreach (object view in contentRegion.ActiveViews)
{
    contentRegion.Deactivate(view);
}

但是此时我得到了一个异常:

System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Deactivation is not possible in this type of region.
  Source=Microsoft.Practices.Prism.Composition
  StackTrace: ...
  InnerException: 

我的区域只在基视图Shell中声明。xaml

<Border Grid.Column="1" BorderBrush="#193441"  BorderThickness="2,2,2,2">
    <ContentControl regions:RegionManager.RegionName="ContentRegion" />
</Border>

Prism:区域停用时的InvalidOperationException.在这种类型的区域中不可能取消激活

区域禁用取决于实现

DeactivateIRegion上的行为取决于它的实现,你在xaml中设置声明区域。

它的实现是由在视图(主视图Shell)中设置的控件类型设置的。xaml。

可能的实现和如何设置它们:

  • SingleActiveRegion(由ContentControl设置):一次只有一个活动区域。它会在其他视图激活时自动停用视图。
  • AllActiveRegion(由ItemsControl设置):所有视图都是可见的和活动的。呼叫Deactivate将导致InvalidOperationException
  • Region(由Selector设置):允许多个活动和非活动视图。

在这篇文章中有广泛的描述。

修改区域声明

对我来说,在这个区域只有一个活动视图更舒服,所以我在Shell.xaml中将区域声明更改为:

<Border Grid.Column="1" BorderBrush="#193441"  BorderThickness="2,2,2,2">
    <ContentControl regions:RegionManager.RegionName="ContentRegion" />
</Border>

现在我的区域类型是SingleActiveRegion我不需要调用Deactivate

何时可以使用Deactivate

  • 当你有ContentControl并且你想只停用活动视图
  • 如果你想保持多个活动视图,你必须在。xaml中使用Selector控件-然后你可以使用Deactivate