Ejemplo n.º 1
0
        void InvokeOnNavigatedFrom(object item, NavigationContext navigationContext)
        {
            var navigationAwareItem = item as INavigationAware;

            if (navigationAwareItem != null)
            {
                navigationAwareItem.OnNavigatedFrom(navigationContext);
            }

            var frameworkElement = item as FrameworkElement;

            if (frameworkElement != null)
            {
                INavigationAware navigationAwareDataContext = frameworkElement.DataContext as INavigationAware;
                if (navigationAwareDataContext != null)
                {
                    navigationAwareDataContext.OnNavigatedFrom(navigationContext);
                }
                if (frameworkElement != null)
                {
                    var        viewModel     = frameworkElement.DataContext;
                    Type       viewModelType = viewModel.GetType();
                    MethodInfo methodInfo    = viewModelType.GetMethod("DisposeEvents");
                    if (methodInfo != null)
                    {
                        methodInfo.Invoke(viewModel, null);
                    }
                }
            }
        }
        /// <summary>
        /// Handles the navigation when we are moving TO a new view/viewmodel.
        /// </summary>
        /// <param name="view"></param>
        /// <param name="viewModel"></param>
        /// <param name="navMode"></param>
        /// <param name="parameter"></param>
        private void HandleOnNavigatingTo(FrameworkElement view, object viewModel, NavigationMode navMode, object parameter)
        {
            // See if the ViewModel participates in navigation-aware services.
            INavigationAware navm = viewModel as INavigationAware;

            if (navm != null)
            {
                IDictionary <string, object> stateDictionary = null;
                if (StateManager != null)
                {
                    string key = GenerateStateKey(PageNavigator.ViewModelKeyPrefix);
                    StateManager.LoadObject(key, viewModel);
                    stateDictionary = StateManager.GetDictionary(key, false);
                }
                navm.OnNavigatedTo(new NavigatedToEventArgs(navMode, parameter, stateDictionary));
            }

            // See if the VIEW participates in navigation-aware services.
            INavigationAware naView = view as INavigationAware;

            if (naView != null)
            {
                IDictionary <string, object> stateDictionary = null;
                if (StateManager != null)
                {
                    string key = GenerateStateKey(PageNavigator.PageKeyPrefix);
                    stateDictionary = StateManager.GetDictionary(key, false);
                }
                naView.OnNavigatedTo(new NavigatedToEventArgs(navMode, parameter, stateDictionary));
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 带参数导航
        /// </summary>
        /// <typeparam name="T">参数类型</typeparam>
        /// <param name="regionName"></param>
        /// <param name="viewID"></param>
        /// <param name="parameter">参数实体</param>
        public static void Navigate <T>(string regionName, string viewID, T parameter)
        {
            if (!m_RegionNameMapControl.ContainsKey(regionName))
            {
                throw new Exception($"不存在此RegionName {regionName}");
            }
            if (!m_ViewIDMapView.ContainsKey(viewID))
            {
                throw new Exception($"不存在此ViewID {viewID}");
            }

            Type           viewType = m_ViewIDMapView[viewID];
            ContentControl control  = m_RegionNameMapControl[regionName];
            object         view     = Activator.CreateInstance(viewType);

            FrameworkElement fe = view as FrameworkElement;

            if (fe != null)
            {
                INavigationAware <T> aware = fe.DataContext as INavigationAware <T>;
                aware?.GetNavigationParameter(parameter);
            }

            control.Content = view;
        }
Ejemplo n.º 4
0
        protected async virtual Task HandleSuccessfulSave(T vm)
        {
            await NotifyUserThatSaveWentWell(vm);

            INavigationAware navigationAwareVm = vm as INavigationAware;

            if (vm != null)
            {
                _regionManager.Regions[RegionNames.ContentRegion].NavigationService.Journal.GoBack();
            }
        }
Ejemplo n.º 5
0
        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            INavigationAware vm = DataContext as INavigationAware;

            if (vm != null)
            {
                vm.OnNavigatedFrom(e.Parameter, e.NavigationMode);
            }

            base.OnNavigatedFrom(e);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Handles the OnNavigatingFrom event which notifies a page/ViewModel that we are
        /// moving AWAY from that view.
        /// </summary>
        /// <param name="rootFrame"></param>
        /// <param name="navMode"></param>
        /// <param name="cancel"></param>
        /// <param name="suspending"></param>
        private void HandleOnNavigatingFrom(Frame rootFrame, NavigationMode navMode, ref bool cancel, bool suspending)
        {
            if (rootFrame.Content != null)
            {
                IDictionary <string, object> stateDictionary = null;
                FrameworkElement             fe = rootFrame.Content as FrameworkElement;
                if (fe != null)
                {
                    if (fe.DataContext != null)
                    {
                        // Attempt to save the object off.
                        if (StateManager != null)
                        {
                            string key = GenerateStateKey(ViewModelKeyPrefix);
                            StateManager.SaveObject(key, fe.DataContext);
                            stateDictionary = StateManager.GetDictionary(key, true);
                        }

                        // See if the ViewModel participates in navigation-aware services.
                        INavigationAware navm = fe.DataContext as INavigationAware;
                        if (navm != null)
                        {
                            var e = (suspending)
                                        ? new NavigatingFromEventArgs(navMode, cancel, stateDictionary)
                                        : new NavigatingFromEventArgs(stateDictionary);
                            navm.OnNavigatingFrom(e);
                            cancel = e.Cancel;
                        }
                    }

                    // See if the VIEW participates in navigation-aware services.
                    INavigationAware naView = fe as INavigationAware;
                    if (naView != null)
                    {
                        // Save off the VIEW
                        stateDictionary = null;
                        if (StateManager != null)
                        {
                            string key = GenerateStateKey(PageKeyPrefix);
                            stateDictionary = StateManager.GetDictionary(key, false);
                        }

                        var e = (suspending)
                                    ? new NavigatingFromEventArgs(navMode, cancel, stateDictionary)
                                    : new NavigatingFromEventArgs(stateDictionary);
                        naView.OnNavigatingFrom(e);
                        cancel = e.Cancel;
                    }
                }
            }
        }
        private void ExecuteSearch(string phrase)
        {
            var searchBar = SearchBarService.Current;

            if (searchBar != null)
            {
                UriQuery query = new UriQuery(searchBar.Parameters.ToString());
                query.Add(SearchBar.ValueParameter, phrase);
                query.Add(SearchBar.IsFromSearchBarParameter, "true");

                IRegion viewRegion = RegionManager.Regions[AppRegions.ViewRegion];
                IRegionNavigationService navigation = viewRegion.NavigationService;

                if (navigation.Journal.CurrentEntry != null)
                {
                    if (navigation.Journal.CurrentEntry.Uri.OriginalString.StartsWith(searchBar.NavigationUri.OriginalString))
                    {
                        INavigationAware navAware = null;
                        var activeView            = viewRegion.ActiveViews.FirstOrDefault();

                        if (activeView is INavigationAware)
                        {
                            navAware = activeView as INavigationAware;
                        }
                        else
                        {
                            FrameworkElement element = activeView as FrameworkElement;

                            if (element != null && element.DataContext is INavigationAware)
                            {
                                navAware = element.DataContext as INavigationAware;
                            }
                        }

                        if (navAware != null)
                        {
                            navAware.OnNavigatedFrom(new NavigationContext(navigation,
                                                                           navigation.Journal.CurrentEntry.Uri));
                            navAware.OnNavigatedTo(new NavigationContext(navigation,
                                                                         new Uri(
                                                                             searchBar.NavigationUri.ToString() + query,
                                                                             UriKind.RelativeOrAbsolute)));
                            return;
                        }
                    }
                }

                RegionManager.RequestNavigate(AppRegions.ViewRegion, searchBar.NavigationUri.ToString() + query);
            }
        }
Ejemplo n.º 8
0
        private void NotifyOnNavigatedTo(object parameter)
        {
            FrameworkElement contentElement = frame.Content as FrameworkElement;

            if (contentElement == null)
            {
                return;
            }

            INavigationAware navigationAwareContext = contentElement.DataContext as INavigationAware;

            if (navigationAwareContext != null)
            {
                navigationAwareContext.OnNavigatedTo(parameter);
            }
        }
Ejemplo n.º 9
0
        private void NotifyOnNavigatingFrom()
        {
            FrameworkElement contentElement = frame.Content as FrameworkElement;

            if (contentElement == null)
            {
                return;
            }

            INavigationAware navigationAwareContext = contentElement.DataContext as INavigationAware;

            if (navigationAwareContext != null)
            {
                navigationAwareContext.OnNavigatingFrom();
            }
        }
Ejemplo n.º 10
0
        private void WireView(FrameworkElement view, Object viewModel, IDictionary <String, String> navigationParameters)
        {
            INavigationAware navigationAware = viewModel as INavigationAware;

            if (navigationAware != null)
            {
                RoutedEventHandler handler = null;
                handler = (o, e) =>
                {
                    navigationAware.Navigated(navigationParameters);
                    view.Loaded -= handler;
                };

                view.Loaded += handler;
            }
            view.DataContext = viewModel;
        }
        protected virtual void HandleSuccessfulSave(T vm, int newId)
        {
            ICancelAwareViewViewModel cancelAwareViewViewModel = vm as ICancelAwareViewViewModel;

            if (cancelAwareViewViewModel != null)
            {
                _regionManager.Regions[RegionNames.ContentRegion].RequestNavigate(cancelAwareViewViewModel.CancelNavigateToViewName);
            }
            else
            {
                INavigationAware navigationAwareVm = vm as INavigationAware;
                if (vm != null)
                {
                    _regionManager.Regions[RegionNames.ContentRegion].NavigationService.Journal.GoBack();
                }
            }
        }
Ejemplo n.º 12
0
        void InvokeOnNavigatedFrom(object item, NavigationContext navigationContext)
        {
            var navigationAwareItem = item as INavigationAware;

            if (navigationAwareItem != null)
            {
                navigationAwareItem.OnNavigatedFrom(navigationContext);
            }

            var frameworkElement = item as FrameworkElement;

            if (frameworkElement != null)
            {
                INavigationAware navigationAwareDataContext = frameworkElement.DataContext as INavigationAware;
                navigationAwareDataContext?.OnNavigatedFrom(navigationContext);
            }
        }
        private void NavigateBack(IEntityAwareViewViewModel vm)
        {
            ICancelAwareViewViewModel cancelAwareViewViewModel = vm as ICancelAwareViewViewModel;

            if (cancelAwareViewViewModel != null)
            {
                _regionManager.Regions[RegionNames.ContentRegion].RequestNavigate(cancelAwareViewViewModel.CancelNavigateToViewName);
            }
            else
            {
                INavigationAware navigationAwareVm = vm as INavigationAware;
                if (vm != null)
                {
                    _regionManager.Regions[RegionNames.ContentRegion].NavigationService.Journal.GoBack();
                }
            }
        }
Ejemplo n.º 14
0
        private static void InvokeOnNavigationAwareElement(object item, Action <INavigationAware> invocation)
        {
            var navigationAwareItem = item as INavigationAware;

            if (navigationAwareItem != null)
            {
                invocation(navigationAwareItem);
            }
            FrameworkElement frameworkElement = item as FrameworkElement;

            if (frameworkElement != null)
            {
                INavigationAware navigationAwareDataContext = frameworkElement.DataContext as INavigationAware;
                if (navigationAwareDataContext != null)
                {
                    invocation(navigationAwareDataContext);
                }
            }
        }
    public void NavigateToWindow <T>(object parameter) where T : IView
    {
        // configure your IoC container to resolve a View for a given ViewModel
        // i.e. container.Register<IPlotView, PlotWindow>(); in your
        // composition root
        IView  view   = container.Resolve <T>();
        Window window = view as Window;

        if (window != null)
        {
            window.Show();
        }
        INavigationAware nav = view as INavigationAware;

        if (nav != null)
        {
            nav.NavigatedTo(parameter);
        }
    }
Ejemplo n.º 16
0
        private async Task <NavigationResult> HandleViewModelNavigation(INavigationAware fromPageVM, INavigationAware toPageVM, INavigationParameters parameters)
        {
            if (fromPageVM != null)
            {
                try
                {
                    fromPageVM.OnNavigatedFrom(parameters);
                }
                catch (Exception ex)
                {
                    return(new NavigationResult()
                    {
                        IsSuccess = false, Exception = ex
                    });
                }
            }


            if (toPageVM != null)
            {
                try
                {
                    toPageVM.OnNavigatingTo(parameters);
                    toPageVM.OnNavigatedTo(parameters);
                    await toPageVM.OnNavigatedToAsync(parameters);
                }
                catch (Exception ex)
                {
                    return(new NavigationResult()
                    {
                        IsSuccess = false, Exception = ex
                    });
                }
            }

            return(new NavigationResult()
            {
                IsSuccess = true
            });
        }
Ejemplo n.º 17
0
        private async Task <bool> navigateAsync(UserControl view, INavigationAware viewModel)
        {
            var previousView = _frame.Content;
            var activator    = viewModel as IActivate;

            if (activator != null)
            {
                await activator.ActivateAsync();
            }

            _frame.Content = view;

            var navigationAware = viewModel;

            if (navigationAware != null && previousView != null)
            {
                navigationAware.NavigatedFrom(previousView.GetType());
            }

            await OnNavigatedAsync(view, viewModel, view.GetType(), previousView?.GetType());

            return(true);
        }
Ejemplo n.º 18
0
        public async Task <bool> NavigateAsync(Type viewType, INavigationAware viewModel)
        {
            Tracer.Info($"Trying to navigate to {viewType.FullName}.");

            var previousView = _frame.Content;
            var success      = await CanNavigateAsync(new NavigatingEventArgs(viewType, previousView?.GetType()));

            if (!success)
            {
                Tracer.Info("Navigation failed.");
                return(false);
            }

            var dispatcher = _frame.Dispatcher;
            var pattern    = new NavigationHandlerTaskSource(
                handler => Navigated += handler,
                handler => Navigated -= handler);

            var view = _container.Resolve(viewType) as UserControl;

            Guard.RequireIsNotNull(view, nameof(view));

            if (dispatcher.CheckAccess())
            {
                success = await navigateAsync(view, viewModel);
            }
            else
            {
                await dispatcher.InvokeAsync(async() => success = await navigateAsync(view, viewModel));
            }

            await pattern.Task;

            Tracer.Info($"Navigation {(success ? "succeeded" : "failed")}.");

            return(success);
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Loads the content from specified uri.
        /// </summary>
        /// <param name="uri">The content uri</param>
        /// <returns>
        /// The loaded content.
        /// </returns>
        protected override Object LoadContent(Uri uri)
        {
            FrameworkElement view = null;

            var viewInfo = this.viewLocater.LocateViewInfo(uri);

            if (viewInfo != null)
            {
                var viewType             = viewInfo.Item1;
                var viewModelType        = viewInfo.Item2;
                var navigationParameters = viewInfo.Item3;

                view = (FrameworkElement)this.resolver.Get(viewType); // get the view.

                if (viewModelType != null)
                {
                    Object viewModel = this.resolver.Get(viewModelType);

                    INavigationAware navigationAware = viewModel as INavigationAware;

                    if (navigationAware != null)
                    {
                        RoutedEventHandler handler = null;
                        handler = (o, e) =>
                        {
                            navigationAware.Navigated(navigationParameters);
                            view.Loaded -= handler;
                        };

                        view.Loaded += handler;
                    }
                    view.DataContext = viewModel;
                }
            }
            return(view);
        }
        /// <summary>
        /// Called when the implementer has been navigated to.
        /// </summary>
        /// <param name="args">Provides data for navigation methods and event handlers that cannot cancel the navigation request.</param>
        private void NavigatedTo(NavigationEventArgs args)
        {
            if(previousPage != null)
                previousPage.OnNavigatedFrom(args);

            previousPage = GetNavigationAware(args.Content);
            if (previousPage == null) return;
            previousPage.OnNavigatedTo(args);
        }
Ejemplo n.º 21
0
 public void SetNavigationContext(INavigationAware navigationAwareVm)
 {
     _navigationAwareVm = navigationAwareVm;
 }