public override ValueTask <MvxBasePresentationAttribute?> CreatePresentationAttribute(Type?viewModelType, Type?viewType) { if (MasterNavigationController == null && (TabBarViewController == null || !TabBarViewController.CanShowChildView())) { MvxLog.Instance.Trace($"PresentationAttribute nor MasterNavigationController found for {viewType.Name}. " + $"Assuming Root presentation"); var rootAttribute = new MvxRootPresentationAttribute() { WrapInNavigationController = true, ViewType = viewType, ViewModelType = viewModelType }; return(new ValueTask <MvxBasePresentationAttribute?>(rootAttribute)); } MvxLog.Instance.Trace($"PresentationAttribute not found for {viewType?.Name}. " + $"Assuming animated Child presentation"); var childAttribute = new MvxChildPresentationAttribute() { ViewType = viewType, ViewModelType = viewModelType }; return(new ValueTask <MvxBasePresentationAttribute?>(childAttribute)); }
protected virtual async Task <bool> ShowRootViewController(UIViewController viewController, MvxRootPresentationAttribute attribute, MvxViewModelRequest request) { if (viewController is IMvxTabBarViewController) { //NOTE clean up must be done first incase we are enbedding into a navigation controller //before setting the tab view controller, otherwise this will reset the view stack and your tab //controller will be null. await SetupWindowRootNavigation(viewController, attribute); this.TabBarViewController = (IMvxTabBarViewController)viewController; return(await CloseModalViewControllers()); } await SetupWindowRootNavigation(viewController, attribute); if (!(await CloseModalViewControllers())) { return(false); } if (!(await CloseTabBarViewController())) { return(false); } if (!(await CloseSplitViewController())) { return(false); } return(true); }
protected virtual Task <bool> CloseRootViewController(IMvxViewModel viewModel, MvxRootPresentationAttribute attribute) { _logger?.LogWarning("Ignored attempt to close the window root (ViewModel type: {viewModelName}", viewModel.GetType().Name); return(Task.FromResult(false)); }
protected void SetupWindowRootNavigation(UIViewController viewController, MvxRootPresentationAttribute attribute) { if (attribute.WrapInNavigationController) { MasterNavigationController = CreateNavigationController(viewController); SetWindowRootViewController(MasterNavigationController); } else { SetWindowRootViewController(viewController); CloseMasterNavigationController(); } }
protected ValueTask <bool> SetupWindowRootNavigation(UIViewController viewController, MvxRootPresentationAttribute attribute) { if (attribute.WrapInNavigationController) { MasterNavigationController = CreateNavigationController(viewController); SetWindowRootViewController(MasterNavigationController); } else { SetWindowRootViewController(viewController); return(CloseMasterNavigationController()); } return(new ValueTask <bool>(true)); }
protected virtual void ShowRootViewController( UIViewController viewController, MvxRootPresentationAttribute attribute, MvxViewModelRequest request) { // check if viewController is a TabBarController if (viewController is IMvxTabBarViewController tabBarController) { TabBarViewController = tabBarController; SetWindowRootViewController(viewController); CloseMasterNavigationController(); CloseModalNavigationController(); CloseSplitViewController(); return; } // check if viewController is a SplitViewController if (viewController is IMvxSplitViewController splitController) { SplitViewController = splitController; SetWindowRootViewController(viewController); CloseMasterNavigationController(); CloseModalNavigationController(); CloseTabBarViewController(); return; } // check if viewController is trying to initialize a navigation stack if (attribute.WrapInNavigationController) { viewController = CreateNavigationController(viewController); MasterNavigationController = viewController as MvxNavigationController; SetWindowRootViewController(viewController); CloseModalNavigationController(); CloseTabBarViewController(); CloseSplitViewController(); return; } // last scenario: display the plain viewController as root SetWindowRootViewController(viewController); }
protected virtual void ShowRootViewController( UIViewController viewController, MvxRootPresentationAttribute attribute, MvxViewModelRequest request) { // first set the new RootViewController if (attribute.WrapInNavigationController) { // viewController is initializing a navigation stack var navigationController = CreateNavigationController(viewController); MasterNavigationController = navigationController as MvxNavigationController; SetWindowRootViewController(navigationController); } else { // set plain ViewController as root SetWindowRootViewController(viewController); CloseMasterNavigationController(); } // check if viewController is a TabBarController if (viewController is IMvxTabBarViewController tabBarController) { TabBarViewController = tabBarController; CloseSplitViewController(); } // check if viewController is a SplitViewController else if (viewController is IMvxSplitViewController splitController) { SplitViewController = splitController; CloseTabBarViewController(); } else { CloseTabBarViewController(); CloseSplitViewController(); } // always clean ModalViewControllers when setting a new root CleanupModalViewControllers(); }
public override async Task <bool> Show(MvxViewModelRequest request) { // XFViewModel means we need a Forms View if (request.ViewModelType.FullName.Contains("XFViewModel")) { //get the xamarin.forms page from the ViewModel var contentPage = MvxPresenterHelpers.CreatePage(request); //MvvmCross call to create the view model with DI etc var viewModel = MvxPresenterHelpers.LoadViewModel(request); //Assign it to the Forms Binding Content contentPage.BindingContext = viewModel; //Creating the view controller from the content page var viewController = contentPage.CreateViewController(); viewController.Title = contentPage.Title; if (this.MasterNavigationController == null) { // If it's the first view MvxRootPresentationAttribute attribute = new MvxRootPresentationAttribute() { AnimationDuration = MvxRootPresentationAttribute.DefaultAnimationDuration, AnimationOptions = MvxRootPresentationAttribute.DefaultAnimationOptions, ViewModelType = request.ViewModelType }; return(await this.ShowRootViewController(viewController, attribute, request)); } else { // If it's already in the stack this.MasterNavigationController.PushViewController(viewController, true); return(await Task.FromResult(true)); } } else { //Using a normal MvvmCross View return(await base.Show(request)); } }
protected virtual void ShowRootViewController( UIViewController viewController, MvxRootPresentationAttribute attribute, MvxViewModelRequest request) { // check if viewController is a TabBarController if (viewController is IMvxTabBarViewController tabBarController) { TabBarViewController = tabBarController; // set root SetupWindowRootNavigation(viewController, attribute); CleanupModalViewControllers(); CloseSplitViewController(); return; } // check if viewController is a SplitViewController if (viewController is IMvxSplitViewController splitController) { SplitViewController = splitController; // set root SetupWindowRootNavigation(viewController, attribute); CleanupModalViewControllers(); CloseTabBarViewController(); return; } // set root initiating stack navigation or just a plain controller SetupWindowRootNavigation(viewController, attribute); CleanupModalViewControllers(); CloseTabBarViewController(); CloseSplitViewController(); }
protected virtual void ShowRootViewController(UIViewController viewController, MvxRootPresentationAttribute attribute, MvxViewModelRequest request) { if (viewController is IMvxTabBarViewController) { //NOTE clean up must be done first incase we are enbedding into a navigation controller //before setting the tab view controller, otherwise this will reset the view stack and your tab //controller will be null. SetupWindowRootNavigation(viewController, attribute); this.TabBarViewController = (IMvxTabBarViewController)viewController; CloseModalViewControllers(); return; } SetupWindowRootNavigation(viewController, attribute); CloseModalViewControllers(); CloseTabBarViewController(); CloseSplitViewController(); }
protected virtual async Task <bool> ShowRootViewController( UIViewController viewController, MvxRootPresentationAttribute attribute, MvxViewModelRequest request) { // check if viewController is a TabBarController if (viewController is IMvxTabBarViewController tabBarController) { TabBarViewController = tabBarController; // set root SetupWindowRootNavigation(viewController, attribute); if (!await CloseModalViewControllers()) { return(false); } if (!await CloseSplitViewController()) { return(false); } return(true); } if (viewController is IMvxPageViewController pageViewController) { PageViewController = pageViewController; // set root SetupWindowRootNavigation(viewController, attribute); if (!await CloseModalViewControllers()) { return(false); } if (!await CloseSplitViewController()) { return(false); } return(true); } // check if viewController is a SplitViewController if (viewController is IMvxSplitViewController splitController) { SplitViewController = splitController; // set root SetupWindowRootNavigation(viewController, attribute); if (!await CloseModalViewControllers()) { return(false); } if (!await CloseTabBarViewController()) { return(false); } return(true); } // set root initiating stack navigation or just a plain controller SetupWindowRootNavigation(viewController, attribute); if (!await CloseModalViewControllers()) { return(false); } if (!await CloseTabBarViewController()) { return(false); } if (!await CloseSplitViewController()) { return(false); } return(true); }
protected override void ShowRootViewController(UIViewController viewController, MvxRootPresentationAttribute attribute, MvxViewModelRequest request) { // check if viewController is a MvxSidebarPanelController if (viewController is MvxSidebarViewController sidebarView) { MasterNavigationController = new MvxNavigationController(); SideBarViewController = sidebarView; SideBarViewController.SetNavigationController(MasterNavigationController); SetWindowRootViewController(viewController); Mvx.RegisterSingleton <IMvxSidebarViewController>(SideBarViewController); CleanupModalViewControllers(); CloseTabBarViewController(); CloseSplitViewController(); CloseMasterNavigationController(); return; } else { SideBarViewController = null; MasterNavigationController = null; base.ShowRootViewController(viewController, attribute, request); } }
protected override async Task <bool> ShowRootViewController(UIViewController viewController, MvxRootPresentationAttribute attribute, MvxViewModelRequest request) { // check if viewController is a MvxSidebarPanelController if (viewController is MvxSidebarViewController sidebarView) { MasterNavigationController = new MvxNavigationController(); SideBarViewController = sidebarView; SideBarViewController.SetNavigationController(MasterNavigationController); SetWindowRootViewController(viewController, attribute); Mvx.IoCProvider.RegisterSingleton <IMvxSidebarViewController>(SideBarViewController); if (!await CloseModalViewControllers()) { return(false); } if (!await CloseTabBarViewController()) { return(false); } if (!await CloseSplitViewController()) { return(false); } CloseMasterNavigationController(); return(true); } else { SideBarViewController = null; MasterNavigationController = null; return(await base.ShowRootViewController(viewController, attribute, request)); } }
protected override async Task <bool> ShowRootViewController(UIViewController viewController, MvxRootPresentationAttribute attribute, MvxViewModelRequest request) { _customPresenter.AddSegmentedControlViewController(viewController, request); return(await base.ShowRootViewController(viewController, attribute, request)); }
protected override void SetWindowRootViewController(UIViewController controller, MvxRootPresentationAttribute attribute = null) { if (_window.RootViewController == null) { // Insert MainView as root controller, subsequent root menu_item controllers will use MainView.ContainerView as root base.SetWindowRootViewController(controller, attribute); _rootController = controller as MvxViewController; // Hack to get around: 'MainView.ContainerView' is inacessible due to its protection level // _containerView = (_window.RootViewController as MainView).ContainerView; _containerView = _window.RootViewController.View.ViewWithTag(1); MenuView = _window.RootViewController.View.ViewWithTag(2); } else { // Move root menu_item controller to ContainerView controller.View.Frame = _containerView.Bounds; controller.WillMoveToParentViewController(_window.RootViewController); _containerView.AddSubview(controller.View); _window.RootViewController.AddChildViewController(controller); controller.DidMoveToParentViewController(_window.RootViewController); } }
protected override void SetWindowRootViewController(UIViewController controller, MvxRootPresentationAttribute attribute = null) { UIView.Transition( _window, Animation.Timings.EnterTiming, UIViewAnimationOptions.TransitionCrossDissolve, () => _window.RootViewController = controller, null ); }
protected virtual void SetWindowRootViewController(UIViewController controller, MvxRootPresentationAttribute attribute = null) { RemoveWindowSubviews(); if (attribute == null || attribute.AnimationOptions == UIViewAnimationOptions.TransitionNone) { _window.RootViewController = controller; return; } UIView.Transition( _window, attribute.AnimationDuration, attribute.AnimationOptions, () => _window.RootViewController = controller, null ); }
protected virtual bool CloseRootViewController(IMvxViewModel viewModel, MvxRootPresentationAttribute attribute) { Mvx.Warning($"Ignored attempt to close the window root (ViewModel type: {viewModel.GetType().Name}"); return(false); }
protected virtual Task <bool> CloseRootViewController(IMvxViewModel viewModel, MvxRootPresentationAttribute attribute) { MvxLog.Instance.Warn($"Ignored attempt to close the window root (ViewModel type: {viewModel.GetType().Name}"); return(Task.FromResult(false)); }