예제 #1
0
        public async Task <bool> NavigateAsync(Type page, object parameter = 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);
            }


            parameter = SerializationService.Serialize(parameter);

            await Task.CompletedTask;

            return(FrameFacadeInternal.Navigate(page, parameter, infoOverride));
        }
예제 #2
0
        public async Task <bool> NavigateAsync(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 == LastNavigationType) && (parameter == LastNavigationParameter))
            {
                return(false);
            }

            if ((page.FullName == LastNavigationType) && (parameter?.Equals(LastNavigationParameter) ?? false))
            {
                return(false);
            }

            parameter = SerializationService.Serialize(parameter);

            await Task.CompletedTask;

            return(FrameFacadeInternal.Navigate(page, parameter, infoOverride));
        }
예제 #3
0
        /*
         *  Navigate<T> allows developers to navigate using a
         *  page key instead of the view type. This is accomplished by
         *  creating a custom Enum and setting up the PageKeys dict
         *  with the Key/Type pairs for your views. The dict is
         *  shared by all NavigationServices and is stored in
         *  the BootStrapper (or Application) of the app.
         *
         *  Implementation example:
         *
         *  // define your Enum
         *  public Enum Pages { MainPage, DetailPage }
         *
         *  // setup the keys dict
         *  var keys = BootStrapper.PageKeys<Views>();
         *  keys.Add(Pages.MainPage, typeof(Views.MainPage));
         *  keys.Add(Pages.DetailPage, typeof(Views.DetailPage));
         *
         *  // use Navigate<T>()
         *  NavigationService.Navigate(Pages.MainPage);
         */

        // T must be the same custom Enum used with BootStrapper.PageKeys()
        public bool Navigate <T>(T key, object parameter = null, NavigationTransitionInfo infoOverride = null)
            where T : struct, IConvertible
        {
            DebugWrite($"Key: {key}, Parameter: {parameter}, NavigationTransitionInfo: {infoOverride}");

            var keys = BootStrapper.Current.PageKeys <T>();

            if (!keys.ContainsKey(key))
            {
                throw new KeyNotFoundException(key.ToString());
            }

            var page = keys[key];

            if (page.FullName.Equals(LastNavigationType))
            {
                if (parameter == LastNavigationParameter)
                {
                    return(false);
                }

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

            parameter = SerializationService.Serialize(parameter);
            return(FrameFacadeInternal.Navigate(page, parameter, infoOverride));
        }
예제 #4
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));
        }
예제 #5
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 = Settings.SerializationStrategy.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 FrameFacadeInternal.Navigate(page, serializedParameter, infoOverride);
            }));
        }
예제 #6
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.Serialize(parameter);
            return(FrameFacadeInternal.Navigate(page, parameter, infoOverride));
        }