/// <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();
        }