Mitch
Mitch

Reputation: 2551

WPF/Silverlight NavigationService backstack

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.

Upvotes: 0

Views: 2007

Answers (1)

Thomas Levesque
Thomas Levesque

Reputation: 292425

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

Upvotes: 2

Related Questions