/// <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> /// Opens the top level view in a separate window. /// </summary> /// <param name="context">The context.</param> /// <param name="messageBoxResult">The message box result.</param> /// <param name="viewResult">The view result.</param> /// <returns>True if successfully opened</returns> private bool OpenTopLevelView(RequestContext context, MessageBoxResult messageBoxResult, ViewResult viewResult) { if (messageBoxResult != null && string.IsNullOrEmpty(viewResult.ViewIconResourceKey)) { viewResult.ViewIconResourceKey = messageBoxResult.ModelMessageBox.IconResourceKey; } //Brush iconBrush = Brushes.Transparent; //if (!string.IsNullOrEmpty(viewResult.ViewIconResourceKey)) // try // { // var resource = Application.Current.FindResource(viewResult.ViewIconResourceKey); // if (resource != null) // iconBrush = (Brush) resource; // } // catch // { // iconBrush = Brushes.Transparent; // } // If we respect local views and the view is in fact a local view, and we have a normal view already open, then we open it in a local way only. if (viewResult.ViewScope == ViewScope.Local && HandleLocalViewsSpecial && SelectedNormalView > -1) { var selectedView = NormalViews[SelectedNormalView]; if (selectedView == null) { return(false); } selectedView.LocalViews.Add(viewResult); if (viewResult.MakeViewVisibleOnLaunch) { selectedView.SelectedLocalViewIndex = selectedView.LocalViews.Count - 1; } return(true); } //Need to make sure we do not open more than allowed - Popups should not close underlying views. if (viewResult.ViewLevel != ViewLevel.Popup && MaximumTopLevelViewCount > -1) { var inplaceTopLevelviews = TopLevelViews.Where(v => v.TopLevelWindow == null).ToList(); while (inplaceTopLevelviews.Count + 1 > MaximumTopLevelViewCount) { CloseViewForModel(inplaceTopLevelviews[0].Model); inplaceTopLevelviews.RemoveAt(0); } } TopLevelViews.Add(viewResult); if (viewResult.MakeViewVisibleOnLaunch && !(TopLevelViewLaunchMode == ViewLaunchMode.Popup || (TopLevelViewLaunchMode == ViewLaunchMode.InPlaceExceptPopups && viewResult.ViewLevel == ViewLevel.Popup))) { SelectedTopLevelView = TopLevelViews.Count - 1; SelectedTopLevelViewResult = SelectedTopLevelView > -1 ? TopLevelViews[SelectedTopLevelView] : null; if (viewResult.View != null) { if (!FocusHelper.FocusFirstControlDelayed(viewResult.View)) { FocusHelper.FocusDelayed(viewResult.View); } } } TopLevelViewCount = TopLevelViews.Count; if (TopLevelViewLaunchMode == ViewLaunchMode.Popup || (TopLevelViewLaunchMode == ViewLaunchMode.InPlaceExceptPopups && viewResult.ViewLevel == ViewLevel.Popup)) { var window = new Window { Title = viewResult.ViewTitle, Content = viewResult.View, DataContext = viewResult.Model, WindowStartupLocation = WindowStartupLocation.CenterScreen, Owner = this }; window.SetBinding(TitleProperty, new Binding("ViewTitle") { Source = viewResult }); // Setting the size strategy var strategy = SimpleView.GetSizeStrategy(viewResult.View); switch (strategy) { case ViewSizeStrategies.UseMinimumSizeRequired: window.SizeToContent = SizeToContent.WidthAndHeight; break; case ViewSizeStrategies.UseMaximumSizeAvailable: window.SizeToContent = SizeToContent.Manual; window.Height = SystemParameters.WorkArea.Height; window.Width = SystemParameters.WorkArea.Width; break; case ViewSizeStrategies.UseSuggestedSize: window.SizeToContent = SizeToContent.Manual; window.Height = SimpleView.GetSuggestedHeight(viewResult.View); window.Width = SimpleView.GetSuggestedWidth(viewResult.View); break; } viewResult.TopLevelWindow = window; if (context.Result is MessageBoxResult) { window.SetResourceReference(StyleProperty, "CODE.Framework.Wpf.Mvvm.Shell-TopLevelMessageBoxWindowStyle"); } else { window.SetResourceReference(StyleProperty, "CODE.Framework.Wpf.Mvvm.Shell-TopLevelWindowStyle"); } if (viewResult.View != null) { foreach (InputBinding binding in viewResult.View.InputBindings) { window.InputBindings.Add(binding); } } if (!FocusHelper.FocusFirstControlDelayed(window)) { FocusHelper.FocusDelayed(window); } if (viewResult.IsModal) { window.ShowDialog(); } else { window.Show(); } } //if (iconBrush != null) //{ // try // { // // TODO: Implement the icon logic // //var iconRect = new Canvas {Height = 96, Width = 96, Background = iconBrush}; // //window.Icon = iconRect.ToIconSource(); // } // catch // { // } //} return(true); }