WPF / Silverlight NavigationService backstack

时间:2010-11-01 01:02:27

标签: wpf silverlight navigation

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

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

这是问题!

我似乎无法解决如何访问backstack以检查页面是否存在,以及如果它存在如何导航到它。

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

1 个答案:

答案 0 :(得分:2)

  

我似乎无法解决如何访问backstack以检查页面是否存在,以及如果它存在如何导航到它。

显然无法从NavigationService访问Backstack,但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);
}