3

我正在使用 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>
4

1 回答 1

5

区域停用取决于实施

on 的行为Deactivate取决于IRegion您在 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并且只想停用活动视图时
  • 如果您想保留多个活动视图,您必须Selector在 .xaml 中使用控件 - 然后您可以使用Deactivate
于 2015-08-06T16:41:15.013 回答