public async Task SaveNavigationAsync() { DebugWrite($"Frame: {FrameFacadeInternal.FrameId}"); if (CurrentPageType == null) { return; } var args = new CancelEventArgs <Type>(FrameFacadeInternal.CurrentPageType); BeforeSavingNavigation?.Invoke(this, args); if (args.Cancel) { return; } var state = FrameFacadeInternal.PageStateSettingsService(GetType().ToString()); if (state == null) { throw new InvalidOperationException("State container is unexpectedly null"); } state.Write <string>("CurrentPageType", CurrentPageType.AssemblyQualifiedName); state.Write <object>("CurrentPageParam", CurrentPageParam); state.Write <string>("NavigateState", FrameFacadeInternal?.GetNavigationState()); await Task.CompletedTask; }
public async Task <bool> RestoreSavedNavigationAsync() { DebugWrite($"Frame: {FrameFacadeInternal.FrameId}"); try { var state = FrameFacadeInternal.PageStateSettingsService(GetType().ToString()); if (state == null || !state.Exists("CurrentPageType")) { return(false); } FrameFacadeInternal.CurrentPageType = Type.GetType(state.Read <string>("CurrentPageType")); FrameFacadeInternal.CurrentPageParam = state.Read <object>("CurrentPageParam"); FrameFacadeInternal.SetNavigationState(state.Read <string>("NavigateState")); await NavigateToAsync(NavigationMode.Refresh, FrameFacadeInternal.CurrentPageParam); while (FrameFacadeInternal.Frame.Content == null) { Task.Yield().GetAwaiter().GetResult(); } AfterRestoreSavedNavigation?.Invoke(this, FrameFacadeInternal.CurrentPageType); return(true); } catch { return(false); } }
async Task NavigateToAsync(NavigationMode mode, object parameter, object frameContent = null) { DebugWrite($"Mode: {mode}, Parameter: {parameter} FrameContent: {frameContent}"); frameContent = frameContent ?? FrameFacadeInternal.Frame.Content; LastNavigationParameter = parameter; LastNavigationType = frameContent.GetType().FullName; var page = frameContent as Page; if (page != null) { if (mode == NavigationMode.New) { var pageState = FrameFacadeInternal.PageStateSettingsService(page.GetType()).Values; pageState?.Clear(); } var dataContext = ResolveForPage(page); if (dataContext != null) { // prepare for state load dataContext.NavigationService = this; dataContext.Dispatcher = this.GetDispatcherWrapper(); dataContext.SessionState = BootStrapper.Current.SessionState; var pageState = FrameFacadeInternal.PageStateSettingsService(page.GetType()).Values; await dataContext.OnNavigatedToAsync(parameter, mode, pageState); // update bindings after NavTo initializes data XamlUtils.InitializeBindings(page); XamlUtils.UpdateBindings(page); } } }
public async Task <bool> LoadAsync() { DebugWrite($"Frame: {FrameFacadeInternal.FrameId}"); try { var index = WindowWrapper.Current().NavigationServices.IndexOf(this); var state = FrameFacadeInternal.PageStateSettingsService($"NavigationService{index}"); if (state == null || !state.Exists("CurrentPageType")) { return(false); } FrameFacadeInternal.CurrentPageType = Type.GetType(state.Read <string>("CurrentPageType")); FrameFacadeInternal.CurrentPageParam = state.Read <object>("CurrentPageParam"); FrameFacadeInternal.NavigationService.NavigationState = state.Read <string>("NavigateState"); await NavigateToAsync(NavigationMode.Refresh, FrameFacadeInternal.CurrentPageParam); while (FrameFacadeInternal.Frame.Content == null) { await Task.Delay(1); } AfterRestoreSavedNavigation?.Invoke(this, FrameFacadeInternal.CurrentPageType); return(true); } catch { return(false); } }
public async void Resuming() { DebugWrite($"Frame: {FrameFacadeInternal.FrameId}"); var page = FrameFacadeInternal.Content as Page; if (page != null) { var dataContext = ResolveForPage(page); if (dataContext != null) { dataContext.NavigationService = this; dataContext.Dispatcher = this.GetDispatcherWrapper(); dataContext.SessionState = BootStrapper.Current.SessionState; var pageState = FrameFacadeInternal.PageStateSettingsService(page.GetType(), parameter: FrameFacadeInternal.CurrentPageParam).Values; await dataContext.OnNavigatedToAsync(FrameFacadeInternal.CurrentPageParam, NavigationMode.Refresh, pageState); // update bindings after NavTo initializes data //XamlUtils.InitializeBindings(page); if (page.Content is UserControl pageWith) { XamlUtils.UpdateBindings(pageWith); } else { XamlUtils.UpdateBindings(page); } } } }
// after navigate async Task NavigateFromAsync(Page page, INavigable dataContext, bool suspending) { DebugWrite($"Suspending: {suspending}"); dataContext.NavigationService = this; dataContext.Dispatcher = this.GetDispatcherWrapper(); dataContext.SessionState = BootStrapper.Current.SessionState; var pageState = FrameFacadeInternal.PageStateSettingsService(page.GetType()).Values; await dataContext.OnNavigatedFromAsync(pageState, suspending); }
// after navigate async Task NavigateFromAsync(Page page, INavigable dataContext, bool suspending) { DebugWrite($"Suspending: {suspending}"); dataContext.NavigationService = this; dataContext.Dispatcher = this.GetDispatcherWrapper(); dataContext.SessionState = BootStrapper.Current.SessionState; var index = WindowWrapper.Current().NavigationServices.IndexOf(this); var pageState = FrameFacadeInternal.PageStateSettingsService($"NavigationService{index}").Values; await dataContext.OnNavigatedFromAsync(pageState, suspending).ConfigureAwait(false); }
public async Task <bool> NavigateAsync(Type page, object parameter = null, IDictionary <string, object> state = null, NavigationTransitionInfo infoOverride = null) { DebugWrite($"Page: {page}, Parameter: {parameter}, NavigationTransitionInfo: {infoOverride}"); if (page == null) { throw new ArgumentNullException(nameof(page)); } // use CurrentPageType/Param instead of LastNavigationType/Parameter to avoid new navigation to the current // page in some race conditions. if ((page.FullName == CurrentPageType?.FullName) && (parameter == CurrentPageParam)) { return(false); } if ((page.FullName == CurrentPageType?.FullName) && (parameter?.Equals(CurrentPageParam) ?? false)) { return(false); } if (state != null) { var pageState = FrameFacadeInternal.PageStateSettingsService(page, 1, parameter).Values; foreach (var item in state) { pageState[item.Key] = item.Value; } } //var frameContent = FrameFacadeInternal.Frame.Content; //if (frameContent is Page current && frameContent is IDisposable disposable && page.FullName == CurrentPageType?.FullName) //{ // if (current.DataContext is INavigable dataContext) // { // await NavigatingFromAsync(current, page, parameter, dataContext, false, NavigationMode.Refresh); // await NavigateFromAsync(current, dataContext, false); // } // await NavigateToAsync(NavigationMode.Refresh, parameter, current); // FrameFacade.CurrentPageParam = parameter; // FrameFacade.Frame.BackStack.Add(new PageStackEntry(page, SerializationService.Serialize(CurrentPageParam), infoOverride)); // return true; //} parameter = SerializationService.Serialize(parameter); return(FrameFacadeInternal.Navigate(page, parameter, infoOverride)); }
async Task NavigateToAsync(NavigationMode mode, object parameter, object frameContent = null) { DebugWrite($"Mode: {mode}, Parameter: {parameter} FrameContent: {frameContent}"); frameContent = frameContent ?? FrameFacadeInternal.Frame.Content; LastNavigationParameter = parameter; LastNavigationType = frameContent.GetType().FullName; var page = frameContent as Page; if (page != null) { if (mode == NavigationMode.New) { var pageState = FrameFacadeInternal.PageStateSettingsService(page.GetType()).Values; pageState?.Clear(); } if (!(page.DataContext is INavigable) | 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 = WindowWrapper.Current(this)?.Dispatcher; dataContext.SessionState = BootStrapper.Current.SessionState; var pageState = FrameFacadeInternal.PageStateSettingsService(page.GetType()).Values; await dataContext.OnNavigatedToAsync(parameter, mode, pageState); { // update bindings after NavTo initializes data XamlUtils.InitializeBindings(page); XamlUtils.UpdateBindings(page); } } } }
async Task NavigateToAsync(NavigationMode mode, object parameter, object frameContent = null) { DebugWrite($"Mode: {mode}, Parameter: {parameter} FrameContent: {frameContent}"); frameContent = frameContent ?? FrameFacadeInternal.Frame.Content; var page = frameContent as Page; if (page != null) { if (page is IDisposable cleanup) { cleanup.Dispose(); } //if (mode == NavigationMode.New) //{ // var pageState = FrameFacadeInternal.PageStateSettingsService(page.GetType()).Values; // pageState?.Clear(); //} var dataContext = ResolveForPage(page); if (dataContext != null) { // prepare for state load dataContext.NavigationService = this; dataContext.Dispatcher = this.GetDispatcherWrapper(); dataContext.SessionState = BootStrapper.Current.SessionState; var pageState = FrameFacadeInternal.PageStateSettingsService(page.GetType(), parameter: parameter).Values; await dataContext.OnNavigatedToAsync(parameter, mode, pageState); // update bindings after NavTo initializes data //XamlUtils.InitializeBindings(page); if (page.Content is UserControl pageWith) { XamlUtils.UpdateBindings(pageWith); } else { XamlUtils.UpdateBindings(page); } } } }
// after navigate async Task NavigateFromAsync(bool suspending) { DebugWrite($"Suspending: {suspending}"); var page = FrameFacadeInternal.Content as Page; if (page != null) { // call viewmodel var dataContext = ResolveForPage(page); if (dataContext != null) { dataContext.NavigationService = this; dataContext.Dispatcher = this.GetDispatcherWrapper(); dataContext.SessionState = BootStrapper.Current.SessionState; var pageState = FrameFacadeInternal.PageStateSettingsService(page.GetType()).Values; await dataContext.OnNavigatedFromAsync(pageState, suspending); } } }