Esempio n. 1
0
 private static void Frame_NavigationFailed(object sender, NavigationFailedEventArgs e) => NavigationFailed?.Invoke(sender, e);
 private void RaiseNavigationFailed(NavigationContext navigationContext, Exception error)
 {
     NavigationFailed?.Invoke(this, new RegionNavigationFailedEventArgs(navigationContext, error));
 }
Esempio n. 3
0
        private bool InnerNavigate(PageStackEntry entry, NavigationMode mode)
        {
            try
            {
                // Navigating
                var navigatingFromArgs = new NavigatingCancelEventArgs(
                    mode,
                    entry.NavigationTransitionInfo,
                    entry.Parameter,
                    entry.SourcePageType
                    );

                Navigating?.Invoke(this, navigatingFromArgs);

                if (navigatingFromArgs.Cancel)
                {
                    // Frame canceled
                    OnNavigationStopped(entry, mode);
                    return(false);
                }

                CurrentEntry?.Instance.OnNavigatingFrom(navigatingFromArgs);

                if (navigatingFromArgs.Cancel)
                {
                    // Page canceled
                    OnNavigationStopped(entry, mode);
                    return(false);
                }

                // Navigate
                var previousEntry = CurrentEntry;
                CurrentEntry = entry;

                if (mode == NavigationMode.New)
                {
                    // Doing this first allows CurrentEntry to reuse existing page if pooling is enabled
                    ReleasePages(ForwardStack);
                }

                if (CurrentEntry.Instance == null)
                {
                    var page = CreatePageInstanceCached(entry.SourcePageType);
                    if (page == null)
                    {
                        return(false);
                    }

                    page.Frame            = this;
                    CurrentEntry.Instance = page;
                }

                Content = CurrentEntry.Instance;

                if (IsNavigationStackEnabled)
                {
                    switch (mode)
                    {
                    case NavigationMode.New:
                        ForwardStack.Clear();
                        if (previousEntry != null)
                        {
                            BackStack.Add(previousEntry);
                        }
                        break;

                    case NavigationMode.Back:
                        ForwardStack.Add(previousEntry);
                        BackStack.Remove(CurrentEntry);
                        break;

                    case NavigationMode.Forward:
                        BackStack.Add(previousEntry);
                        ForwardStack.Remove(CurrentEntry);
                        break;

                    case NavigationMode.Refresh:
                        break;
                    }
                }

                // Navigated
                var navigationEvent = new NavigationEventArgs(
                    CurrentEntry.Instance,
                    mode,
                    entry.NavigationTransitionInfo,
                    entry.Parameter,
                    entry.SourcePageType,
                    null
                    );

                previousEntry?.Instance.OnNavigatedFrom(navigationEvent);
                CurrentEntry.Instance.OnNavigatedTo(navigationEvent);
                Navigated?.Invoke(this, navigationEvent);

                VisualTreeHelper.CloseAllPopups();

                return(true);
            }
            catch (Exception exception)
            {
                NavigationFailed?.Invoke(this, new NavigationFailedEventArgs(entry.SourcePageType, exception));

                if (NavigationFailed == null)
                {
                    Application.Current.RaiseRecoverableUnhandledException(new InvalidOperationException("Navigation failed", exception));
                }

                return(false);
            }
        }
Esempio n. 4
0
 private void WebView_NavigationFailed(object sender, WebViewNavigationFailedEventArgs e)
 {
     NavigationFailed?.Invoke(sender, e);
 }
Esempio n. 5
0
 internal void OnNavigationFailed(WebViewNavigationFailedEventArgs args)
 {
     NavigationFailed?.Invoke(this, args);
 }
Esempio n. 6
0
 public static void OnNavigationFailed(object sender, NavigationFailedEventArgs e) =>
 NavigationFailed.Invoke(sender, e);
Esempio n. 7
0
 /// <summary>
 /// Raises the navigation failed event.
 /// </summary>
 /// <param name="e">The navigation failed event arguments.</param>
 private void OnNavigationFailed(NavigationFailedEventArgs e)
 {
     NavigationFailed?.Invoke(this, e);
 }
Esempio n. 8
0
 void PART_Frame_NavigationFailed(object sender, NavigationFailedEventArgs e)
 {
     NavigationFailed?.Invoke(this, e);
 }
Esempio n. 9
0
 private void OnFrameNavigationFailed(object sender, NavigationFailedEventArgs e) => NavigationFailed?.Invoke(sender, e);
Esempio n. 10
0
 /// <summary>
 /// Invokes the <see cref="NavigationFailed"/> event.
 /// </summary>
 /// <param name="sourceType">The source type</param>
 /// <param name="parameter">The parameter</param>
 /// <param name="navigationType">The navigation type</param>
 protected void OnNavigationFailed(Type sourceType, object parameter, NavigationType navigationType)
 {
     NavigationFailed?.Invoke(this, new NavigationEventArgs(sourceType, parameter, navigationType));
 }
        private static Task NavigateInner <T>(T target) where T : INavigationTarget
        {
            return(InvokeOnDispatcherAsync(() =>
            {
                if (_shellResolver == null)
                {
                    throw new InvalidOperationException("Shell resolver must be set before invoking Navigate method.");
                }

                var type = target.GetType();
                if (!_navitaionTargetToConfigs.ContainsKey(type))
                {
                    NavigationFailed?.Invoke(NavigationFailReason.NotConfigured, target);
                    return;
                }

                //1. Find config
                var configs = _navitaionTargetToConfigs[type];
                // If registered more than 1 config, find config which matches target. If no found or only 1 config - use first navigation config.
                var config = (configs.Count > 1 ? configs.FirstOrDefault(x => x.MatchesTarget(target)) : null) ?? configs.First();
                var navMode = config.Mode;
                if (navMode == NavigationMode.DependsOnTarget)
                {
                    navMode = config.GetNavigationMode(target);
                }


                // Navigation mode after getting from config cannot be NavigationMode.DependsOnTarget
                if (navMode == NavigationMode.DependsOnTarget)
                {
                    throw new InvalidOperationException("NavigationConfig.GetNavigationMode returned invalid value: NavigationMode.DependsOnTarget");
                }

                ShellState shellState = null;
                bool existingShell = false;

                if (!config.AllowMultiple)
                {
                    var conflict = _states.FirstOrDefault(x => x.Config == config);
                    if (conflict != null)
                    {
                        //Check if config can handle navigation when already navigated.
                        try
                        {
                            if (config.TryHandleNavigation(target, conflict.Data))
                            {
                                return;
                            }
                        }
                        catch (NotImplementedException) { }
                        NavigationFailed?.Invoke(NavigationFailReason.NotAllowedToHaveMultiple, target);
                        return; // No futher navigation required.
                    }
                }

                //Only for default navigation mode can be searched existing shells.
                if (navMode == NavigationMode.Default)
                {
                    //Try find available shell
                    foreach (var state in _states)
                    {
                        // Check if config allows reuse shell
                        if (!state.Config.CanLeave(target))
                        {
                            continue;
                        }

                        //Only Default and NewWindow can be reused.
                        if (!(state.Mode == NavigationMode.Default || state.Mode == NavigationMode.NewWindow))
                        {
                            continue;
                        }


                        // On this line shell can be reused.
                        shellState = state;
                        existingShell = true;
                        break;
                    }
                }

                // Create shell data from config
                object shellData;
                ShellBase parent = null;
                if (!existingShell)
                {
                    // Check if need to set parent.
                    if ((navMode == NavigationMode.ChildWindow ||
                         navMode == NavigationMode.DialogWindow))
                    {
                        // Set parent window if shellState.Mode is Dialog or Child
                        if (_states.Any()) //TODO: Improve logic for selecting parent window.
                        {
                            parent = _states[0].Shell;
                        }
                    }

                    // Create new shell if not found available.
                    var shell = _shellResolver.CreateShell(parent);
                    shellState = new ShellState(shell);
                    shellState.ShellClosed += ShellStateOnShellClosed;
                    _states.Add(shellState);

                    shellData = config.GenerateDataForTarget(target, shellState.Shell.Dispatcher);
                    if (shellData == null)
                    {
                        throw new InvalidOperationException("Config returned null from generating object for target.");
                    }

                    // Set data in ShellBase
                    shellState.Load(navMode, config, target, shellData);

                    // Show shell.
                    if (shellState.Mode == NavigationMode.DialogWindow)
                    {
                        shellState.Shell.Dispatcher.InvokeAsync(() => shellState.Shell.ShowDialog());
                    }
                    else
                    {
                        shellState.Shell.Dispatcher.Invoke(() =>
                        {
                            shellState.Shell.Show();
                            shellState.Shell.Activate();
                        });
                    }
                }
                else
                {
                    shellData = config.GenerateDataForTarget(target, shellState.Shell.Dispatcher);
                    if (shellData == null)
                    {
                        throw new InvalidOperationException("Config returned null from generating object for target.");
                    }

                    // Unload current navigatable data.
                    shellState.Unload();

                    // Set data in ShellBase
                    shellState.Load(navMode, config, target, shellData);
                }

                //Navigation to target comleted.
                shellState.NavigationCompleted(parent);
            }));
        }
Esempio n. 12
0
        private bool InnerNavigate(PageStackEntry entry, NavigationMode mode)
        {
            try
            {
                // Navigating
                var navigatingFromArgs = new NavigatingCancelEventArgs(
                    mode,
                    entry.NavigationTransitionInfo,
                    entry.Parameter,
                    entry.SourcePageType
                    );

                Navigating?.Invoke(this, navigatingFromArgs);

                CurrentEntry?.Instance.OnNavigatingFrom(navigatingFromArgs);

                if (navigatingFromArgs.Cancel)
                {
                    NavigationStopped?.Invoke(this, new NavigationEventArgs(
                                                  entry.Instance,
                                                  mode,
                                                  entry.NavigationTransitionInfo,
                                                  entry.Parameter,
                                                  entry.SourcePageType,
                                                  null
                                                  ));
                    return(false);
                }

                // Navigate
                var previousEntry = CurrentEntry;
                CurrentEntry = entry;

                if (CurrentEntry.Instance == null)
                {
                    var page = CreatePageInstance(entry.SourcePageType);
                    if (page == null)
                    {
                        return(false);
                    }

                    page.Frame            = this;
                    CurrentEntry.Instance = page;
                }

                Content = CurrentEntry.Instance;

                switch (mode)
                {
                case NavigationMode.New:
                    ForwardStack.Clear();
                    if (previousEntry != null)
                    {
                        BackStack.Add(previousEntry);
                    }
                    break;

                case NavigationMode.Back:
                    ForwardStack.Add(previousEntry);
                    BackStack.Remove(CurrentEntry);
                    break;

                case NavigationMode.Forward:
                    BackStack.Add(previousEntry);
                    ForwardStack.Remove(CurrentEntry);
                    break;

                case NavigationMode.Refresh:
                    break;
                }

                // Navigated
                var navigationEvent = new NavigationEventArgs(
                    CurrentEntry.Instance,
                    mode,
                    entry.NavigationTransitionInfo,
                    entry.Parameter,
                    entry.SourcePageType,
                    null
                    );

                previousEntry?.Instance.OnNavigatedFrom(navigationEvent);
                CurrentEntry.Instance.OnNavigatedTo(navigationEvent);
                Navigated?.Invoke(this, navigationEvent);

                VisualTreeHelper.CloseAllPopups();

                return(true);
            }
            catch (Exception exception)
            {
                NavigationFailed?.Invoke(this, new NavigationFailedEventArgs(entry.SourcePageType, exception));
                return(false);
            }
        }