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.

Answers


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

Need Your Help

Creating a custom ODBC driver

sql database sdk odbc odbc-bridge

At my current job, we're looking to implement our own odbc driver to allow many different applications to be able to connect to our own app as a datasource. Right now we are trying to weigh the opt...

CUDA multi gpu: running same kernel (dual chip device)

cuda multi-gpu chip

I'm writing code that must run same kernel on GTX690 (dual chip) board. Since computation is pretty separable, I don't need data exchange between devices, I just merge the result on the CPU. I unde...

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.