private async Task OnNavigatingFromAsync(NavigatingCancelEventArgs e, IHandleNavigatingFrom handler)
        {
            var navigationServiceNavigatingCancelEventArgs = e.ToNavigationServiceNavigatingCancelEventArgs();

            await InvokeHandlerOnNavigatingFromAsync(handler, navigationServiceNavigatingCancelEventArgs);

            if (!navigationServiceNavigatingCancelEventArgs.Cancel)
            {
                _alreadyPerformedOnNavigatingFrom = true;

#if WINDOWS_PHONE || WINDOWS_PHONE_81
                Dispatcher.BeginInvoke(() =>
                {
                    var frame = this.GetVisualAncestor <Frame>();

                    switch (e.NavigationMode)
                    {
                    case NavigationMode.New:
                        frame.Navigate(e.Uri);
                        break;
#else
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    var frame = this.Frame;

                    switch (e.NavigationMode)
                    {
                    case NavigationMode.New:
                        frame.Navigate(e.SourcePageType, e.Parameter, e.NavigationTransitionInfo);
                        break;
#endif

                    case NavigationMode.Back:
                        frame.GoBack();
                        break;

                    case NavigationMode.Forward:
                        frame.GoForward();
                        break;
                    }
                });
            }
        }
    }
}
예제 #2
0
        /// <summary>
        /// Invoked immediately before the page is unloaded and is no longer the current source of a parent frame.
        /// </summary>
        /// <param name="e">An object that contains the event data.</param>
        protected override async void OnNavigatingFrom(NavigatingCancelEventArgs e)
        {
            base.OnNavigatingFrom(e);

            if (_alreadyPerformedOnNavigatingFrom)
            {
                _alreadyPerformedOnNavigatingFrom = false;
            }
            else
            {
                var viewModel = DataContext as IHandleNavigatingFrom;

                if (viewModel != null)
                {
#if WINDOWS_PHONE || WINDOWS_PHONE_81
                    if (e.IsCancelable)
                    {
                        e.Cancel = true;
                    }
#else
                    e.Cancel = true;
#endif

                    var navigationServiceNavigatingCancelEventArgs = e.ToNavigationServiceNavigatingCancelEventArgs();

                    await viewModel.OnNavigatingFromAsync(navigationServiceNavigatingCancelEventArgs);

                    if (navigationServiceNavigatingCancelEventArgs.IsCancelable && !navigationServiceNavigatingCancelEventArgs.Cancel)
                    {
                        _alreadyPerformedOnNavigatingFrom = true;

#if WINDOWS_PHONE || WINDOWS_PHONE_81
                        this.GetVisualAncestor <Frame>().Navigate(e.Uri);
#else
                        this.GetVisualAncestor <Frame>().Navigate(e.SourcePageType, e.Parameter, e.NavigationTransitionInfo);
#endif
                    }
                }
            }
        }
        private async Task OnNavigatingFromAsync(NavigatingCancelEventArgs e, IHandleNavigatingFrom handler)
        {
            var navigationServiceNavigatingCancelEventArgs = e.ToNavigationServiceNavigatingCancelEventArgs();

            await InvokeHandlerOnNavigatingFromAsync(handler, navigationServiceNavigatingCancelEventArgs);

            if (!navigationServiceNavigatingCancelEventArgs.Cancel)
            {
                _alreadyPerformedOnNavigatingFrom = true;

#if WINDOWS_PHONE || WINDOWS_PHONE_81
                Dispatcher.BeginInvoke(() =>
                {
                    var frame = this.GetVisualAncestor<Frame>();

                    switch (e.NavigationMode)
                    {
                        case NavigationMode.New:
                            frame.Navigate(e.Uri);
                            break;
#else
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    var frame = this.Frame;

                    switch (e.NavigationMode)
                    {
                        case NavigationMode.New:
                            frame.Navigate(e.SourcePageType, e.Parameter, e.NavigationTransitionInfo);
                            break;
#endif

                        case NavigationMode.Back:
                            frame.GoBack();
                            break;

                        case NavigationMode.Forward:
                            frame.GoForward();
                            break;
                    }
                });
            }
        }
    }
}