我正在开发一个使用 Microsoft Prism 框架的 WPF 应用程序。该应用程序的一个方面是一个“模态”区域,它可以容纳覆盖整个窗口的任意数量的模态窗口。随着更多视图被导航到该区域,每个窗口都会向右滑动以允许新窗口占据屏幕的中心。这是一个更直观的解释:
当“模态”区域包含单个视图时:
当另一个视图添加到区域时:
当添加更多视图时:
我使用一个自定义控件来管理其子项的动画和显示。下面是控件的 custom方法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());
RegionAdapter
理想情况下,我将能够使用 Prism 的“日志”概念向后导航,但是当重新导航到该区域中的视图时,我看不到响应的方式。
任何提示将不胜感激。
编辑
通过遵循 GOstrowsky 的建议(请参阅已接受答案中的评论),我能够实现此功能 - 我将区域适配器更改为仅在该区域中维护一个活动视图(当前位于屏幕中心的视图)。然后我可以通过myRegion.ActiveViews.FirstOrDefault()
.
另一个编辑
此后,我再次更改了此实现,因为我们需要能够删除当前在该区域中的任何视图,而不仅仅是最后一个。有关详细信息,请参阅接受的答案。