Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detect back button or forward button navigation in a silverlight navigation application

When a Page is navigated to in silverlight you can override this method.

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
}

The NavigationEventArgs has a NavigationMode enumeration which is defined as

public enum NavigationMode
{
    New = 0,
    Back = 1,
    Forward = 2,
    Refresh = 3,
}

But calling e.NavigationMode always throws a NotImplementedException

Is there a way in silverlight to detect a page is being navigated to because the user hit the forward/back browser button.

What I am trying to achieve is some kind of state that can be preserved when the user hits the back button.

For example assume you have a customer page which is showing a list of customers in a datagrid. The user can select a customer and there is a detail view which shows all the orders for that customer. Now within an order item you can click a hyperlink link that takes you to the shipping history of the order which is a separate page. When the user hits the back button I want to go back to the customers page and automatically select the customer he was viewing. Is this possible at all ?

I also tried out the fragment navigation feature

NavigationService.Navigate(new Uri("#currentcustomerid=" 
       + customer.Id.ToString(), UriKind.Relative));

when the customer selection changes but this adds too many items to the history when the user clicks various customers on the customer page.

EDIT

There is also an method you can override

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
}

which is the same as handling the NavigationService.Navigating event as indicated by BugFinder's answer. In this method e.NavigationMode always returns New when when you hit the Back or Forward Button. The only time this method returns Back is when you explicitly call NavigationService.GoBack()

like image 580
parapura rajkumar Avatar asked Aug 31 '12 15:08

parapura rajkumar


People also ask

What event is fired when the back button of a browser is pressed?

The popstate event will be triggered by doing a browser action such as a click on the back or forward button (or calling history. back() or history. forward() in JavaScript). Browsers tend to handle the popstate event differently on page load.

What is the browser back button?

A back button in the browser lets you back-up to the copies of pages you visited previously. The web browser's back and next buttons work well with web sites that provide information that changes infrequently, such as news and shopping web sites.


2 Answers

The

public enum NavigationMode 
{ 
    New = 0, 
    Back = 1, 
    Forward = 2, 
    Refresh = 3, 
} 

applies to the Navigating event..

if I do

_ns.Navigating += ns_Navigating;
        void ns_Navigating(object sender, NavigatingCancelEventArgs e)
        {

            if (SecurityCheck(e.Uri.OriginalString)) return;
            e.Cancel = true;
            ShowError("You are not authorised to view this page");
        }

I can see there that e.NavigationMode is set. You could do your test there?

like image 75
BugFinder Avatar answered Nov 03 '22 03:11

BugFinder


I don't think there are any easy ways to do it out of the box, as far as I know.

What you are trying to achieve can be easily done using a framework I created at http://ultimateframework.codeplex.com

What I have done is to mesh the silverlight navigation frame and prism navigation together, so you will need unity and prism and mvvm friendly.

What you want to achieve can be done using the framework in the following ways

1) Implement IsNavigationTarget and returns true --> which will keep the same instance when navigating back, therefore, keeping the selection/selected item.

2) Access the onnavigatedto's journal to track where you came from, say /item/1 was the previous stack, so you know back button has been pressed from item 1.

3) You can even implement your own back/forward/refresh within the custom control provided for achieving the same result (not in codeplex yet)

I actually use it for production code at work, and I created it, so please feel free to try it out. Note that the version on there is buggy, and I have yet to have time to release our latest build, but should you require it, I will update it for you :), just pm me.

like image 39
Joshscorp Avatar answered Nov 03 '22 02:11

Joshscorp