【发布时间】:2014-04-21 06:35:00
【问题描述】:
我正在开发一个使用 Microsoft Prism 框架的 WPF 应用程序。该应用程序的一个方面是“模态”区域,它可以容纳覆盖整个窗口的任意数量的模态窗口。随着更多视图被导航到该区域,每个窗口都会向右滑动以允许新窗口占据屏幕的中心。这是一个更直观的解释:
当“模态”区域包含单个视图时:
当另一个视图被添加到区域时:
当添加更多视图时:
我使用一个自定义控件来管理其子项的动画和显示。下面是控件的自定义RegionAdapter 的Adapt 方法的样子:
protected override void Adapt(IRegion region, ModalContainer regionTarget)
{
region.ActiveViews.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler((o, e) =>
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
foreach(FrameworkElement element in e.NewItems)
{
regionTarget.AddChild(element);
}
}
else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
foreach (FrameworkElement element in e.OldItems)
{
regionTarget.RemoveChild(element);
}
}
});
}
我的问题是这样的:导航回较早窗口的最佳方法是什么? 目前,我知道触发上述RemoveChild 方法的唯一方法是显式删除视图该区域,这要求我在某处保留该区域中当前所有视图的列表:
// to remove the most recently added view from the region
_regionManager.Regions["ModalRegion"].Remove(addedViews.Pop());
理想情况下,我可以使用 Prism 的“日志”概念向后导航,但在我的 RegionAdapter 中没有看到当重新导航到该区域中的视图时做出响应的方法。
任何提示将不胜感激。
编辑
我能够通过遵循 GOstrowsky 的建议来实现此功能(请参阅已接受答案中的 cmets) - 我更改了我的区域适配器以仅在该区域中维护一个活动视图(当前位于中心的视图屏幕)。然后我可以通过myRegion.ActiveViews.FirstOrDefault() 将该视图作为删除目标。
又一次编辑
此后我再次更改了此实现,因为我们需要能够删除当前在该区域中的任何视图,而不仅仅是最后一个。有关详细信息,请参阅接受的答案。
【问题讨论】:
标签: wpf prism region regionadapter