如何确定WPF页面是否仍在WPF框架的导航历史记录中,然后再导航回该页面?
摘要:
我的WPF应用程序使用单个MainWindow,其中包含两个框架,一个用于菜单布局,另一个用于显示内容。我正在使用MVVM模式,将内容显示为WPF页面作为视图,每个视图/页面后面的代码尽可能少。
XAML:
以下是创建WPF页面并通过静态帮助程序类在主窗口中显示它的典型代码:
public static void ShowPeriodicTable()
{
var page = new Views.PeriodicTable();
(Application.Current.MainWindow as MainWindow).ContentArea.Navigate(page);
}
即使该代码已经加载,该代码也会一次又一次地加载同一页面。
我进行了以下更改,以在创建并导航到页面之前检测当前页面是否显示在MainWindow.ContentArea(框架)中。
public static void ShowPeriodicTable()
{
var currentPage = ((DRC_SQLITE.MainWindow)Application.Current.MainWindow).ContentArea.Content;
if (currentPage == null || (currentPage != null && currentPage.GetType().Name != "PeriodicTable"))
{
var page = new Views.PeriodicTable();
(Application.Current.MainWindow as MainWindow).ContentArea.Navigate(page);
}
}
问题:
如何检测要打开的页面在导航历史记录中是否存在,而不是框架中的当前页面。在下图中,settingPage被打开了两次。我想消除这种情况以更好地管理应用程序的内存使用情况。
答案 0 :(得分:1)
页面很少在商业应用中使用。据我了解,它们确实是用于xbap(浏览器中的wpf)的。 将用户控件托管在contentcontrol中更为常见。 在这种情况下,有两种常用的替代方法
1) 首先查看。 持有按类型键入的用户控件字典。 https://gallery.technet.microsoft.com/WPF-Navigation-Basic-Sample-11f10c74
./code
支持者指出导航可以说是视图责任。
2) 首先是视图模型。
将contentcontrol的内容绑定到mainwindowviewmodel中的属性。 将其切换到每个视图的视图模型,并将其切换到用户控件。 然后,您可以通过为每个视图保留对视图模型的引用来控制保留状态。
如果您真的想坚持自己拥有的东西,那么Frame.BackStack是日记中条目的集合。您可以对其进行迭代并检查每个对象的类型。我认为这实际上是对页面的引用。我从未见过将这种方法用于商业应用程序。