/// <summary> /// This method closes all currently open views /// </summary> /// <returns>True if the handler successfully closed all views. False if it didn't close all views or generally does not handle view closing</returns> /// <exception cref="System.NotImplementedException"></exception> public bool CloseAllViews() { var topLevelViews = TopLevelViews.ToArray(); foreach (var view in topLevelViews) { TopLevelViews.Remove(view); if (view.TopLevelWindow != null) { view.TopLevelWindow.Close(); } view.RaiseViewClosed(); } SelectedTopLevelView = -1; SelectedTopLevelViewResult = null; TopLevelViewCount = 0; var normalViews = NormalViews.ToArray(); foreach (var view in normalViews) { NormalViews.Remove(view); if (view.TopLevelWindow != null) { view.TopLevelWindow.Close(); } view.RaiseViewClosed(); } SelectedNormalView = -1; SelectedNormalViewResult = null; NormalViewCount = 0; return(true); }
/// <summary> /// This method is invoked when a view that is associated with a certain model should be closed /// </summary> /// <param name="model"></param> /// <returns></returns> public bool CloseViewForModel(object model) { foreach (var view in TopLevelViews) { if (view.Model != null && view.Model == model) { TopLevelViews.Remove(view); SelectedTopLevelView = TopLevelViews.Count - 1; SelectedTopLevelViewResult = SelectedTopLevelView > -1 ? TopLevelViews[SelectedTopLevelView] : null; TopLevelViewCount = TopLevelViews.Count; if (view.TopLevelWindow != null) { view.TopLevelWindow.Close(); } view.RaiseViewClosed(); return(true); } } foreach (var view in NormalViews) { if (view.Model != null && view.Model == model) { NormalViews.Remove(view); SelectedNormalView = NormalViews.Count - 1; SelectedNormalViewResult = SelectedNormalView > -1 ? NormalViews[SelectedNormalView] : null; NormalViewCount = NormalViews.Count; if (view.TopLevelWindow != null) { view.TopLevelWindow.Close(); } view.RaiseViewClosed(); return(true); } foreach (var localView in view.LocalViews) { if (localView.Model != null && localView.Model == model) { view.LocalViews.Remove(localView); if (view.SelectedLocalViewIndex >= view.LocalViews.Count) { view.SelectedLocalViewIndex = view.LocalViews.Count - 1; } localView.RaiseViewClosed(); return(true); } } } return(false); }
/// <summary> /// This method is invoked when a view is opened /// </summary> /// <param name="context">Request context (contains information about the view)</param> /// <returns> /// True if handled successfully /// </returns> public bool OpenView(RequestContext context) { if (context.Result is StatusMessageResult) { return(HandleStatusMessage(context)); } if (context.Result is NotificationMessageResult) { var result = context.Result as NotificationMessageResult; return(HandleNotificationMessage(context, result.Model.OverrideTimeout)); } var viewResult = context.Result as ViewResult; if (viewResult != null && viewResult.ForceNewShell) { if ((viewResult.ViewLevel == ViewLevel.Normal && NormalViewCount > 0) || (viewResult.ViewLevel == ViewLevel.TopLevel && TopLevelViewCount > 0)) { // A new shell should be opened, so we try to create another shell and then hand off view opening duties to it, rather than handling it directly var shellLauncher = Controller.GetShellLauncher() as WindowShellLauncher <Shell>; if (shellLauncher != null) { if (shellLauncher.OpenAnotherShellInstance()) { return(Current.OpenView(context)); } } } } var messageBoxResult = context.Result as MessageBoxResult; if (messageBoxResult != null) { if (messageBoxResult.View == null) { var messageBoxViewModel = messageBoxResult.Model as MessageBoxViewModel; if (messageBoxViewModel != null) { var textBlock = new TextBlock { TextWrapping = TextWrapping.Wrap, Text = messageBoxViewModel.Text }; textBlock.SetResourceReference(StyleProperty, "CODE.Framework.Wpf.Mvvm.Shell-MessageBox-Text"); if (!string.IsNullOrEmpty(messageBoxViewModel.IconResourceKey)) { var grid = new Grid(); grid.ColumnDefinitions.Clear(); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); var rect = new Rectangle { Fill = messageBoxViewModel.IconBrush }; rect.SetResourceReference(StyleProperty, "CODE.Framework.Wpf.Mvvm.Shell-MessageBox-Image"); grid.Children.Add(rect); grid.Children.Add(textBlock); Grid.SetColumn(textBlock, 1); SimpleView.SetSizeStrategy(grid, ViewSizeStrategies.UseMinimumSizeRequired); messageBoxResult.View = grid; } else { messageBoxResult.View = textBlock; } } } if (messageBoxResult.View != null) { var messageBoxModelAction = messageBoxResult.Model as IHaveActions; if (messageBoxModelAction != null) { messageBoxResult.View.InputBindings.Clear(); foreach (var action in messageBoxModelAction.Actions) { if (action.ShortcutKey != Key.None) { messageBoxResult.View.InputBindings.Add(new KeyBinding(action, action.ShortcutKey, action.ShortcutModifiers)); } } } } } if (viewResult != null && viewResult.View != null && !viewResult.IsPartial) { if (viewResult.ViewLevel == ViewLevel.Popup || viewResult.ViewLevel == ViewLevel.StandAlone || viewResult.ViewLevel == ViewLevel.TopLevel) { return(OpenTopLevelView(context, messageBoxResult, viewResult)); } // This is an normal (main) view // Need to make sure we do not open more than allowed if (MaximumNormalViewCount > -1) { var inplaceNormalViews = NormalViews.Where(v => v.TopLevelWindow == null).ToList(); while (inplaceNormalViews.Count + 1 > MaximumNormalViewCount) { CloseViewForModel(inplaceNormalViews[0].Model); inplaceNormalViews.RemoveAt(0); } } NormalViews.Add(viewResult); if (viewResult.MakeViewVisibleOnLaunch) { FocusManager.SetFocusedElement(this, viewResult.View); SelectedNormalView = NormalViews.Count - 1; SelectedNormalViewResult = SelectedNormalView > -1 ? NormalViews[SelectedNormalView] : null; } NormalViewCount = NormalViews.Count; if (NormalViewLaunchMode == ViewLaunchMode.Popup) { OpenNormalViewInWindow(context, viewResult); } return(true); } return(false); }