/// <summary> /// Navigates to the current page type defined in <see cref="CurrentPageType"/>. /// </summary> /// <param name="mode">The navigation mode.</param> /// <param name="parameter">The parameter.</param> internal void NavigateTo(NavigationMode mode, object parameter) { _lastNavigationParameter = parameter; _lastNavigationType = FrameFacade.Content.GetType().FullName; // clears the frame state when a page is newly navigated (not just refreshed or back navigated) if (mode == NavigationMode.New) { FrameFacade.ClearFrameState(); } var page = FrameFacade.Content as Page; if (page != null) { // call viewmodel var dataContext = page.DataContext as INavigable; if (dataContext != null) { // prepare for state load dataContext.NavigationService = this; var pageState = FrameFacade.GetPageStateContainer(page.GetType()); dataContext.OnNavigatedTo(parameter, mode, pageState); } } }
/// <summary> /// Navigate from that is called after navigation. /// </summary> /// <param name="suspending">The suspending flag.</param> internal async Task NavigateFromAsync(bool suspending) { var page = FrameFacade.Content as Page; if (page != null) { // call viewmodel var dataContext = page.DataContext as INavigable; if (dataContext != null) { var pageState = FrameFacade.GetPageStateContainer(page.GetType()); await dataContext.OnNavigatedFromAsync(pageState, suspending); } } }
/// <summary> /// Restores the saved navigation state. /// </summary> /// <returns>Returns True for success, else False.</returns> public bool RestoreSavedNavigation() { try { var state = FrameFacade.GetPageStateContainer(GetType()); if (state == null || !state.Any() || !state.ContainsKey(CURRENT_PAGE_TYPE_KEY)) { return(false); } string currentPageType = state[CURRENT_PAGE_TYPE_KEY].ToString(); Type pageTypeOfAppAssembly = Type.GetType(string.Format("{0}, {1}", currentPageType, UniversalApp.AppAssemblyName)); FrameFacade.CurrentPageType = pageTypeOfAppAssembly; FrameFacade.CurrentPageParam = state[CURRENT_PAGE_PARAM_KEY]; FrameFacade.SetNavigationState(state[NAVIGATE_STATE_KEY].ToString()); while (FrameFacade.Frame.Content == null) /* wait */ } { AfterRestoreSavedNavigation?.Invoke(this, FrameFacade.CurrentPageType); return(true); }
/// <summary> /// Save the navigation state. /// </summary> public void SaveNavigation() { // it is possible to close the application before we have navigated and created state if (CurrentPageType == null) { return; } var state = FrameFacade.GetPageStateContainer(GetType()); if (state == null) { throw new InvalidOperationException("State container is unexpectedly null"); } state[CURRENT_PAGE_TYPE_KEY] = CurrentPageType.ToString(); try { state[CURRENT_PAGE_PARAM_KEY] = CurrentPageParam; } catch { throw new Exception("Failed to serialize page parameter, override/implement ToString()"); } state[NAVIGATE_STATE_KEY] = FrameFacade?.GetNavigationState(); }