WPF/Silverlight NavigationService backstack

落爺英雄遲暮 提交于 2019-12-24 22:32:47

问题


I'm writing an app using WPF (should apply to Silverlight too) where I have a Frame within a main Window and I'm using the NavigationService to navigate through the pages of the Frame.

I am using NavigationService.GoBack to successfully return to the previous page but there are times when I will need to go to a specific page within the NavigationService backstack. If the page doesn't exist in the backstack then I will simply create a new page and navigate to it. By doing this, I'm hoping that the state of the page will be retained if it exists in the backstack, but if it doesn't a new one will be created.

HERE'S THE QUESTION!

I can't seem to work out how to access the backstack to check if the page exists, and then how to navigate to it if it does.

I'd also like to mention that I'm not using URI to navigate but page objects instead as I need to pass values between pages.


回答1:


I can't seem to work out how to access the backstack to check if the page exists, and then how to navigate to it if it does.

Apparently there is no way to access the backstack from the NavigationService, but Frame exposes a BackStack property, so you can do something like:

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

However there doesn't seem to be a way to jump directly to a specific entry in the history... The best you can do is find the index of the entry, and go back N times to get there, which is quite ugly:

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);
}


来源:https://stackoverflow.com/questions/4066024/wpf-silverlight-navigationservice-backstack

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!