如何在导航历史记录中查找WPF页面以防止再次打开该页面

时间:2018-11-24 15:12:45

标签: wpf mvvm

如何确定WPF页面是否仍在WPF框架的导航历史记录中,然后再导航回该页面?

摘要:

我的WPF应用程序使用单个MainWindow,其中包含两个框架,一个用于菜单布局,另一个用于显示内容。我正在使用MVVM模式,将内容显示为WPF页面作为视图,每个视图/页面后面的代码尽可能少。

内容框架(以红色显示)具有可见的NavigationUI。 enter image description here

XAML:

enter image description here

以下是创建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被打开了两次。我想消除这种情况以更好地管理应用程序的内存使用情况。

enter image description here

1 个答案:

答案 0 :(得分:1)

页面很少在商业应用中使用。据我了解,它们确实是用于xbap(浏览器中的wpf)的。 将用户控件托管在contentcontrol中更为常见。 在这种情况下,有两种常用的替代方法

1) 首先查看。 持有按类型键入的用户控件字典。 https://gallery.technet.microsoft.com/WPF-Navigation-Basic-Sample-11f10c74

./code

支持者指出导航可以说是视图责任。

2) 首先是视图模型。

将contentcontrol的内容绑定到mainwindowviewmodel中的属性。 将其切换到每个视图的视图模型,并将其切换到用户控件。 然后,您可以通过为每个视图保留对视图模型的引用来控制保留状态。

如果您真的想坚持自己拥有的东西,那么Frame.BackStack是日记中条目的集合。您可以对其进行迭代并检查每个对象的类型。我认为这实际上是对页面的引用。我从未见过将这种方法用于商业应用程序。