Пример #1
0
        internal NavigationService(Frame frame)
        {
            FrameFacade = new FrameFacade(frame);
            FrameFacade.Navigating += async (s, e) =>
            {
                if (e.Suspending)
                    return;

                // allow the viewmodel to cancel navigation
                e.Cancel = !NavigatingFrom(false);
                if (!e.Cancel)
                {
                    await NavigateFromAsync(false);
                }
            };
            FrameFacade.Navigated += (s, e) =>
            {
                NavigateTo(e.NavigationMode, e.Parameter);
            };
        }
Пример #2
0
        public async Task <bool> NavigateAsync(Type page, object parameter = null, NavigationTransitionInfo infoOverride = null)
        {
            DebugWrite($"Page: {page}, Parameter: {parameter}, NavigationTransitionInfo: {infoOverride}");

            // serialize parameter
            var serializedParameter = default(string);

            try
            {
                serializedParameter = SerializationService.Serialize(parameter);
            }
            catch
            {
                throw new Exception("Parameter cannot be serialized. See https://github.com/Windows-XAML/Template10/wiki/Page-Parameters");
            }

            return(await NavigationOrchestratorAsync(page, parameter, NavigationMode.New, () =>
            {
                return FrameFacade.Navigate(page, serializedParameter, infoOverride);
            }));
        }
Пример #3
0
        public async Task <bool> LoadAsync()
        {
            // load navigation state from settings

            DebugWrite($"Frame: {FrameFacade.FrameId}");

            try
            {
                var frameState = Suspension.GetFrameState();
                if (frameState == null || !frameState.Exists("CurrentPageType"))
                {
                    return(false);
                }

                CurrentPageType  = frameState.Read <Type>("CurrentPageType");
                CurrentPageParam = frameState.Read <object>("CurrentPageParam");
                FrameFacade.SetNavigationState(frameState.Read <string>("NavigateState"));

                while (FrameFacade.Content == null)
                {
                    await Task.Delay(1);
                }

                var newPage      = FrameFacade.Content as Page;
                var newViewModel = newPage?.DataContext;

                // newTemplate10ViewModel.Properties
                if (newViewModel is ITemplate10ViewModel)
                {
                    Navigation.SetupViewModel(this, newViewModel as ITemplate10ViewModel);
                }

                // newNavigatedAwareAsync.OnNavigatedTo
                await Navigation.NavedToAsync(newPage?.DataContext, CurrentPageParam, NavigationMode.Refresh, newPage);

                RaiseAfterRestoreSavedNavigation();
                return(true);
            }
            catch { return(false); }
        }
Пример #4
0
        protected internal NavigationService(Frame frame)
        {
            SerializationService = Services.SerializationService.SerializationService.Json;

            FrameFacadeInternal             = new FrameFacade(this, frame);
            FrameFacadeInternal.Navigating += async(s, e) =>
            {
                if (e.Suspending)
                {
                    return;
                }

                // allow the viewmodel to cancel navigation
                e.Cancel = !(await NavigatingFromAsync(false, e.NavigationMode));
                if (!e.Cancel)
                {
                    await NavigateFromAsync(false);
                }
            };
            FrameFacadeInternal.Navigated += async(s, e) =>
            {
                var parameter = SerializationService.Deserialize(e.Parameter?.ToString());
                if (Equals(e.Parameter?.ToString(), SerializationService.Serialize(LastNavigationParameter)))
                {
                    parameter = LastNavigationParameter;
                }
                await WindowWrapper.Current().Dispatcher.DispatchAsync(async() =>
                {
                    try
                    {
                        await NavigateToAsync(e.NavigationMode, parameter, FrameFacadeInternal.Frame.Content);
                    }
                    catch (Exception ex)
                    {
                        DebugWrite($"DispatchAsync/NavigateToAsync {ex.Message}");
                        throw;
                    }
                }, 1);
            };
        }
Пример #5
0
        protected internal NavigationService(Frame frame)
        {
            FrameFacade             = new FrameFacade(frame);
            FrameFacade.Navigating += async(s, e) =>
            {
                if (e.Suspending)
                {
                    return;
                }

                // allow the viewmodel to cancel navigation
                e.Cancel = !NavigatingFrom(false);
                if (!e.Cancel)
                {
                    await NavigateFromAsync(false);
                }
            };
            FrameFacade.Navigated += (s, e) =>
            {
                NavigateTo(e.NavigationMode, ParameterSerializationService.Instance.DeserializeParameter(e.Parameter));
            };
        }
Пример #6
0
        public NavigationService(Frame frame)
        {
            _frame             = new FrameFacade(frame);
            _frame.Navigating += async(s, e) =>
            {
                if (e.Suspending)
                {
                    return;
                }

                // allow the viewmodel to cancel navigation
                e.Cancel = !NavigatingFrom(false);
                if (!e.Cancel)
                {
                    await NavigateFromAsync(false);
                }
            };
            _frame.Navigated += (s, e) =>
            {
                NavigateTo(e.NavigationMode, e.Parameter);
            };
        }
Пример #7
0
        public bool Navigate(Type page, object parameter = null, NavigationTransitionInfo infoOverride = null)
        {
            if (page == null)
            {
                throw new ArgumentNullException(nameof(page));
            }
            if (page.FullName.Equals(LastNavigationType))
            {
                if (parameter == LastNavigationParameter)
                {
                    return(false);
                }

                if (parameter != null && parameter.Equals(LastNavigationParameter))
                {
                    return(false);
                }
            }

            parameter = ParameterSerializationService.Instance.SerializeParameter(parameter);
            return(FrameFacade.Navigate(page, parameter, infoOverride));
        }
Пример #8
0
        public void SaveNavigation()
        {
            if (CurrentPageType == null)
            {
                return;
            }

            var state = FrameFacade.PageStateContainer(GetType());

            if (state == null)
            {
                throw new InvalidOperationException("State container is unexpectedly null");
            }

            state["CurrentPageType"] = CurrentPageType.ToString();
            try { state["CurrentPageParam"] = CurrentPageParam; }
            catch
            {
                throw new Exception("Failed to serialize page parameter, override/implement ToString()");
            }
            state["NavigateState"] = FrameFacade?.GetNavigationState();
        }
Пример #9
0
        protected internal NavigationService(Frame frame)
        {
            FrameFacade             = new FrameFacade(frame);
            FrameFacade.Navigating += async(s, e) =>
            {
                if (e.Suspending)
                {
                    return;
                }

                // allow the viewmodel to cancel navigation
                e.Cancel = !NavigatingFrom(false);
                if (!e.Cancel)
                {
                    await NavigateFromAsync(false);
                }
            };
            FrameFacade.Navigated += async(s, e) =>
            {
                var parameter = SerializationService.SerializationService.Deserialize(e.Parameter);
                await WindowWrapper.Current().Dispatcher.DispatchAsync(() => { NavigateTo(e.NavigationMode, parameter, Frame.Content); }, 1);
            };
        }
Пример #10
0
        public bool RestoreSavedNavigation()
        {
            try
            {
                var state = FrameFacade.PageStateContainer(GetType());
                if (state == null || !state.Any() || !state.ContainsKey("CurrentPageType"))
                {
                    return(false);
                }

                FrameFacade.CurrentPageType  = Type.GetType(state["CurrentPageType"].ToString());
                FrameFacade.CurrentPageParam = ParameterSerializationService.Instance.DeserializeParameter(state["CurrentPageParam"]?.ToString());
                FrameFacade.SetNavigationState(state["NavigateState"]?.ToString());
                NavigateTo(NavigationMode.Refresh, FrameFacade.CurrentPageParam);
                while (Frame.Content == null)
                {
                    Task.Yield().GetAwaiter().GetResult();
                }
                AfterRestoreSavedNavigation?.Invoke(this, FrameFacade.CurrentPageType);
                return(true);
            }
            catch { return(false); }
        }
Пример #11
0
        void NavigateTo(NavigationMode mode, object parameter)
        {
            LastNavigationParameter = parameter;
            LastNavigationType      = FrameFacade.Content.GetType().FullName;

            if (mode == NavigationMode.New)
            {
                FrameFacade.ClearFrameState();
            }

            var page = FrameFacade.Content as Page;

            if (page != null)
            {
                if (page.DataContext == null)
                {
                    // to support dependency injection, but keeping it optional.
                    var viewmodel = BootStrapper.Current.ResolveForPage(page.GetType(), this);
                    if (viewmodel != null)
                    {
                        page.DataContext = viewmodel;
                    }
                }

                // call viewmodel
                var dataContext = page.DataContext as INavigable;
                if (dataContext != null)
                {
                    // prepare for state load
                    dataContext.NavigationService = this;
                    dataContext.Dispatcher        = Common.WindowWrapper.Current(this)?.Dispatcher;
                    dataContext.SessionState      = BootStrapper.Current.SessionState;
                    var pageState = FrameFacade.PageStateContainer(page.GetType());
                    dataContext.OnNavigatedTo(parameter, mode, pageState);
                }
            }
        }
Пример #12
0
        public bool Navigate(Type page, object parameter = null, NavigationTransitionInfo infoOverride = null)
        {
            DebugWrite($"Page: {page}, Parameter: {parameter}, NavigationTransitionInfo: {infoOverride}");

            if (page == null)
            {
                throw new ArgumentNullException(nameof(page));
            }
            if (page.FullName.Equals(LastNavigationType))
            {
                if (parameter == LastNavigationParameter)
                {
                    return(false);
                }

                if (parameter != null && parameter.Equals(LastNavigationParameter))
                {
                    return(false);
                }
            }

            parameter = SerializationService.SerializationService.Serialize(parameter);
            return(FrameFacade.Navigate(page, parameter, infoOverride));
        }
Пример #13
0
        public async Task <bool> GoBackAsync(NavigationTransitionInfo infoOverride = null)
        {
            if (!CanGoBack)
            {
                return(false);
            }
            var previous  = FrameFacade.BackStack.LastOrDefault();
            var parameter = SerializationService.Deserialize(previous.Parameter?.ToString());

            return(await NavigationOrchestratorAsync(previous.SourcePageType, parameter, NavigationMode.Back, () =>
            {
                try
                {
                    FrameFacade.GoBack(infoOverride);
                    return true;
                }
                catch (Exception ex)
                {
                    // Catch and ignore exceptions
                    DebugWrite(ex.Message, Severities.Error);
                    return false;
                }
            }));
        }
Пример #14
0
        public async Task <bool> GoForwardAsync()
        {
            if (!FrameFacade.CanGoForward)
            {
                return(false);
            }
            var next      = FrameFacade.ForwardStack.FirstOrDefault();
            var parameter = SerializationService.Deserialize(next.Parameter?.ToString());

            return(await NavigationOrchestratorAsync(next.SourcePageType, parameter, NavigationMode.Forward, () =>
            {
                try
                {
                    FrameFacade.GoForward();
                    return true;
                }
                catch (Exception ex)
                {
                    // Catch and ignore exceptions
                    DebugWrite(ex.Message, Severities.Error);
                    return false;
                }
            }));
        }
Пример #15
0
 internal NavigationService(Frame frame) : this()
 {
     FrameFacade  = new FrameFacade(frame, this as INavigationService);
     _ViewService = new Lazy <IViewService>(() => new ViewService.ViewService());
 }
Пример #16
0
 public void GoForward()
 {
     FrameFacade.GoForward();
 }
Пример #17
0
 public void Refresh()
 {
     FrameFacade.Refresh();
 }
Пример #18
0
 public void ClearCache(bool removeCachedPagesInBackStack = false) => FrameFacade.ClearCache(removeCachedPagesInBackStack);
Пример #19
0
 public void RaiseForwardRequested(HandledEventArgs args)
 {
     ForwardRequested?.Invoke(this, args);
     // for backwards compat
     FrameFacade.RaiseForwardRequested(args);
 }
Пример #20
0
 public void RaiseNavigating(Portable.NavigatingEventArgs e)
 {
     Navigating?.Invoke(this, e);
     // for backwards compat
     FrameFacade.RaiseNavigating(e);
 }
Пример #21
0
 public SuspensionStateLogic(FrameFacade frame, NavigationService navigationService)
 {
     this.NavigationService = navigationService;
     this.FrameFacade       = frame;
 }
Пример #22
0
 public void ClearHistory()
 {
     FrameFacade.SetNavigationState(EmptyNavigation);
 }