【问题标题】:WPF/Silverlight NavigationService backstackWPF/Silverlight NavigationService 后台堆栈
【发布时间】:2010-11-01 01:02:26
【问题描述】:

我正在使用 WPF(也应该适用于 Silverlight)编写一个应用程序,其中我在主窗口中有一个 Frame,并且我正在使用 NavigationService 浏览 Frame 的页面。

我正在使用 NavigationService.GoBack 成功返回到上一页,但有时我需要转到 NavigationService 后台堆栈中的特定页面。如果该页面在后台堆栈中不存在,那么我将简单地创建一个新页面并导航到它。通过这样做,我希望如果它存在于 backstack 中,页面的状态将被保留,但如果它不存在,则会创建一个新的。

问题来了!

我似乎不知道如何访问后台堆栈以检查页面是否存在,如果存在则如何导航到它。

我还想提一下,我没有使用 URI 进行导航,而是使用页面对象,因为我需要在页面之间传递值。

【问题讨论】:

    标签: wpf silverlight navigation


    【解决方案1】:

    我似乎不知道如何访问后台堆栈以检查页面是否存在,如果存在则如何导航到它。

    显然没有办法从NavigationService 访问后台堆栈,但是Frame 公开了BackStack 属性,因此您可以执行以下操作:

    if (frame.BackStack.Cast<object>().Contains(thePage))
    ...
    

    但是似乎没有办法直接跳转到历史中的特定条目...您可以做的最好的事情是找到该条目的索引,然后返回N次到达那里,即很丑:

    int index = frame.BackStack.Cast<object>()
                     .Select((page, i) => new { page, i + 1 })
                     .Where(x => Equals(x.Page, thePage))
                     .FirstOrDefault();
    if (index > 0)
    {
        for(int i = 0; i < index; i++) frame.GoBack();
    }
    else
    {
        frame.Navigate(thePage);
    }
    

    【讨论】:

    • 非常感谢您的 cmets Thomas,我很惊讶无法访问 backstack!你的代码也很有帮助,所以再次感谢。米奇
    • 这仍然有效吗? Silverlight 中的 ContentFrame 似乎没有 BackStack 属性。
    • @MikeC.,Silverlight 中似乎不存在此属性。 SL 的另一个限制......
    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多