コード例 #1
0
        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;
        }
コード例 #2
0
        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); }
        }
コード例 #3
0
        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);
                }
            }
        }
コード例 #4
0
        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); }
        }
コード例 #5
0
ファイル: NavigationService.cs プロジェクト: GuocRen/Unigram
        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);
                    }
                }
            }
        }
コード例 #6
0
        // 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);
        }
コード例 #7
0
        // 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);
        }
コード例 #8
0
        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));
        }
コード例 #9
0
        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);
                    }
                }
            }
        }
コード例 #10
0
        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);
                    }
                }
            }
        }
コード例 #11
0
        // 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);
                }
            }
        }