コード例 #1
0
        public void RaiseNavigated(object page, object parameter, Prism.Navigation.NavigationMode mode)
        {
            var navigatedEventArgs = new Portable.NavigatedEventArgs()
            {
                Page           = page,
                Parameter      = parameter,
                NavigationMode = mode,
                PageType       = page?.GetType(),
            };

            RaiseNavigated(navigatedEventArgs);
        }
コード例 #2
0
 private INavigationParameters UpdateInternalParameters(INavigationParameters parameters, Prism.Navigation.NavigationMode mode)
 {
     parameters = parameters ?? new NavigationParameters();
     parameters.SetNavigationMode(mode);
     parameters.SetSyncronizationContext(_syncContext);
     return(parameters);
 }
コード例 #3
0
        private async Task <INavigationResult> OrchestrateAsync(
            INavigationParameters parameters,
            Prism.Navigation.NavigationMode mode,
            Func <Task <bool> > navigate)
        {
            // setup default parameters

            CurrentParameters = parameters;
            parameters        = UpdateInternalParameters(parameters, mode);

            // pre-events

            var old_vm = (_frame.Content as Page)?.DataContext;

            if (old_vm is null)
            {
                _logger.Log($"No view-model is set for source page; this is okay; skipping all the [from] overrides including CanNavigate/Async.", Category.Info, Priority.None);
            }
            else if (!await CanNavigateAsync(parameters, old_vm))
            {
                return(this.NavigationFailure($"[From]{old_vm}.CanNavigateAsync returned false; this is okay; FrameFacade orchestration will stop here."));
            }
            else if (!CanNavigate(parameters, old_vm))
            {
                return(this.NavigationFailure($"[From]{old_vm}.CanNavigate returned false; this is okay; FrameFacade orchestration will stop here."));
            }

            // navigate

            var success = await NavigateFrameAsync(navigate);

            _logger.Log($"{nameof(FrameFacade)}.{nameof(OrchestrateAsync)}.NavigateFrameAsync() returned {success}.", Category.Info, Priority.None);
            if (!success)
            {
                return(this.NavigationFailure("NavigateFrameAsync() returned false; this is very unusual, but possibly okay; FrameFacade orchestration will stop here."));
            }

            if (!(_frame.Content is Page new_page))
            {
                var message = "There is no new page in FrameFacade after NavigateFrameAsync; this is a critical failure. Check the page constructor, maybe?";
                _logger.Log(message, Category.Exception, Priority.High);
                throw new Exception(message);
            }

            // post-events

            if (old_vm != null)
            {
                OnNavigatedFrom(parameters, old_vm);
            }

            var new_vm = new_page?.DataContext;

            if (new_vm is null)
            {
                if (Mvvm.ViewModelLocator.GetAutowireViewModel(new_page) is null)
                {
                    // developer didn't set autowire, and did't set datacontext manually
                    _logger.Log("No view-model is set for target page, we will attempt to find view-model declared using RegisterForNavigation<P, VM>().", Category.Info, Priority.None);

                    // set the autowire & see if we can find it for them
                    Mvvm.ViewModelLocator.SetAutowireViewModel(new_page, true);

                    // TODO: I wonder if I need to delay for a second?

                    new_vm = new_page.DataContext;

                    if (new_vm != null)
                    {
                        _logger.Log($"View-Model: {new_vm} found for target View: {new_page}.", Category.Info, Priority.None);
                    }
                }
            }

            if (new_vm is null)
            {
                _logger.Log($"View-Model for source page not found; this is okay, skipping all the [to] overides.", Category.Info, Priority.None);
            }
            else
            {
                OnNavigatingTo(parameters, new_vm);
                await OnNavigatedToAsync(parameters, new_vm);

                OnNavigatedTo(parameters, new_vm);
            }

            // refresh-bindings

            BindingUtilities.UpdateBindings(new_page);

            // finally

            return(this.NavigationSuccess());
        }
コード例 #4
0
 private INavigationParameters CreateDefaultParameters(INavigationParameters parameters, Prism.Navigation.NavigationMode mode)
 {
     parameters = parameters ?? new NavigationParameters();
     parameters.SetNavigationMode(mode);
     parameters.SetNavigationService(_navigationService);
     parameters.SetSyncronizationContext(_syncContext);
     return(parameters);
 }
コード例 #5
0
        public bool RaiseNavigatingCancels(object page, object parameter, bool suspending, Prism.Navigation.NavigationMode mode, Type targetType)
        {
            var navigatingDeferral  = new Template10.Mobile.Common.DeferralManager();
            var navigatingEventArgs = new Portable.NavigatingEventArgs(navigatingDeferral)
            {
                Page                = page,
                Parameter           = parameter,
                Suspending          = suspending,
                NavigationMode      = mode,
                TargetPageType      = targetType,
                TargetPageParameter = parameter,
            };

            RaiseNavigating(navigatingEventArgs);
            return(navigatingEventArgs.Cancel);
        }