The OnNavigatingFrom
method allows you to intercept a navigation event and to even cancel the navigation if needed. Additionally, there may be times when you want to redirect the user to a different URI based on some conditional logic.
The NavigationService
, however, does not support overlapping navigation. That is, you are unable to cancel an existing navigation and immediately commence another.
You can, however, cancel navigation and schedule navigation to a different Uri
using the page’s Dispatcher
property, as shown in the following excerpt:
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
if (e.Uri.ToString().Contains("RequestedUrl"))
{
e.Cancel = true;
/* Perform the redirect on the UI thread. */
Dispatcher.BeginInvoke(() => NavigationService.Navigate(
new Uri("RedirectUrl", UriKind.Relative)));
}
base.OnNavigatingFrom(e);
}
By using the Dispatcher
to invoke the lambda expression, which performs the call to the NavigationService
, you allow the current navigation to complete first. This works because the UI thread can be thought of as a queue of prioritized delegates, all waiting in turn to be executed. After all the Navigating
event handlers have been serviced, the delegate represented by the lambda expression will be taken of the queue and performed by the UI thread. This technique, of using the Dispatcher
to enqueue an action, is also useful when working with some UI controls, whose event handlers may be called before the control is finished reacting to a user action.
18.117.74.231