我正在使用WPF编写应用程序(也应该适用于Silverlight),我在主窗口中有一个Frame,我正在使用NavigationService来浏览Frame的页面。
我正在使用NavigationService.GoBack成功返回上一页,但有时我需要转到NavigationService backstack中的特定页面。如果Backstack中不存在该页面,那么我将只创建一个新页面并导航到该页面。通过这样做,我希望如果页面的状态存在于backstack中,它将被保留,但如果不存在则将创建新的页面状态。
这是问题!
我似乎无法解决如何访问backstack以检查页面是否存在,以及如果它存在如何导航到它。
我还想提一下,我不是使用URI来导航而是使用页面对象,因为我需要在页面之间传递值。
答案 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);
}