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)); } }
/// <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; }
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(); } }
protected override void OnNavigatedFrom(NavigationEventArgs e) { INavigationAware vm = DataContext as INavigationAware; if (vm != null) { vm.OnNavigatedFrom(e.Parameter, e.NavigationMode); } base.OnNavigatedFrom(e); }
/// <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); } }
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); } }
private void NotifyOnNavigatingFrom() { FrameworkElement contentElement = frame.Content as FrameworkElement; if (contentElement == null) { return; } INavigationAware navigationAwareContext = contentElement.DataContext as INavigationAware; if (navigationAwareContext != null) { navigationAwareContext.OnNavigatingFrom(); } }
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(); } } }
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(); } } }
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); } }
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 }); }
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); }
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); }
/// <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); }
public void SetNavigationContext(INavigationAware navigationAwareVm) { _navigationAwareVm = navigationAwareVm; }