internal UIElement CreateUIElementForModel(ILayoutElement model) { if (model is LayoutPanel) return new LayoutPanelControl(model as LayoutPanel); if (model is LayoutAnchorablePaneGroup) return new LayoutAnchorablePaneGroupControl(model as LayoutAnchorablePaneGroup); if (model is LayoutDocumentPaneGroup) return new LayoutDocumentPaneGroupControl(model as LayoutDocumentPaneGroup); if (model is LayoutAnchorSide) { var templateModelView = new LayoutAnchorSideControl(model as LayoutAnchorSide); templateModelView.SetBinding(LayoutAnchorSideControl.TemplateProperty, new Binding("AnchorSideTemplate") { Source = this }); return templateModelView; } if (model is LayoutAnchorGroup) { var templateModelView = new LayoutAnchorGroupControl(model as LayoutAnchorGroup); templateModelView.SetBinding(LayoutAnchorGroupControl.TemplateProperty, new Binding("AnchorGroupTemplate") { Source = this }); return templateModelView; } if (model is LayoutDocumentPane) { var templateModelView = new LayoutDocumentPaneControl(model as LayoutDocumentPane); templateModelView.SetBinding(LayoutDocumentPaneControl.StyleProperty, new Binding("DocumentPaneControlStyle") { Source = this }); return templateModelView; } if (model is LayoutAnchorablePane) { var templateModelView = new LayoutAnchorablePaneControl(model as LayoutAnchorablePane); templateModelView.SetBinding(LayoutAnchorablePaneControl.StyleProperty, new Binding("AnchorablePaneControlStyle") { Source = this }); return templateModelView; } if (model is LayoutAnchorableFloatingWindow) { if (DesignerProperties.GetIsInDesignMode(this)) return null; var modelFW = model as LayoutAnchorableFloatingWindow; var newFW = new LayoutAnchorableFloatingWindowControl(modelFW) { //Owner = Window.GetWindow(this) }; newFW.SetParentToMainWindowOf(this); var paneForExtensions = modelFW.RootPanel.Children.OfType<LayoutAnchorablePane>().FirstOrDefault(); if (paneForExtensions != null) { //ensure that floating window position is inside current (or nearest) monitor paneForExtensions.KeepInsideNearestMonitor(); newFW.Left = paneForExtensions.FloatingLeft; newFW.Top = paneForExtensions.FloatingTop; newFW.Width = paneForExtensions.FloatingWidth; newFW.Height = paneForExtensions.FloatingHeight; } newFW.ShowInTaskbar = false; newFW.Show(); // Do not set the WindowState before showing or it will be lost if( paneForExtensions != null && paneForExtensions.IsMaximized ) { newFW.WindowState = WindowState.Maximized; } return newFW; } if (model is LayoutDocumentFloatingWindow) { if (DesignerProperties.GetIsInDesignMode(this)) return null; var modelFW = model as LayoutDocumentFloatingWindow; var newFW = new LayoutDocumentFloatingWindowControl(modelFW) { //Owner = Window.GetWindow(this) }; newFW.SetParentToMainWindowOf(this); var paneForExtensions = modelFW.RootDocument; if (paneForExtensions != null) { //ensure that floating window position is inside current (or nearest) monitor paneForExtensions.KeepInsideNearestMonitor(); newFW.Left = paneForExtensions.FloatingLeft; newFW.Top = paneForExtensions.FloatingTop; newFW.Width = paneForExtensions.FloatingWidth; newFW.Height = paneForExtensions.FloatingHeight; } newFW.ShowInTaskbar = false; newFW.Show(); // Do not set the WindowState before showing or it will be lost if( paneForExtensions != null && paneForExtensions.IsMaximized ) { newFW.WindowState = WindowState.Maximized; } return newFW; } if (model is LayoutDocument) { var templateModelView = new LayoutDocumentControl() { Model = model as LayoutDocument }; return templateModelView; } return null; }
internal void StartDraggingFloatingWindowForContent(LayoutContent contentModel, bool startDrag = true) { if (!contentModel.CanFloat) return; var contentModelAsAnchorable = contentModel as LayoutAnchorable; if (contentModelAsAnchorable != null && contentModelAsAnchorable.IsAutoHidden) contentModelAsAnchorable.ToggleAutoHide(); var parentPane = contentModel.Parent as ILayoutPane; var parentPaneAsPositionableElement = contentModel.Parent as ILayoutPositionableElement; var parentPaneAsWithActualSize = contentModel.Parent as ILayoutPositionableElementWithActualSize; var contentModelParentChildrenIndex = parentPane.Children.ToList().IndexOf(contentModel); if (contentModel.FindParent<LayoutFloatingWindow>() == null) { ((ILayoutPreviousContainer)contentModel).PreviousContainer = parentPane; contentModel.PreviousContainerIndex = contentModelParentChildrenIndex; } parentPane.RemoveChildAt(contentModelParentChildrenIndex); double fwWidth = contentModel.FloatingWidth; double fwHeight = contentModel.FloatingHeight; if (fwWidth == 0.0) fwWidth = parentPaneAsPositionableElement.FloatingWidth; if (fwHeight == 0.0) fwHeight = parentPaneAsPositionableElement.FloatingHeight; if (fwWidth == 0.0) fwWidth = parentPaneAsWithActualSize.ActualWidth; if (fwHeight == 0.0) fwHeight = parentPaneAsWithActualSize.ActualHeight; LayoutFloatingWindow fw; LayoutFloatingWindowControl fwc; if (contentModel is LayoutAnchorable) { var anchorableContent = contentModel as LayoutAnchorable; fw = new LayoutAnchorableFloatingWindow() { RootPanel = new LayoutAnchorablePaneGroup( new LayoutAnchorablePane(anchorableContent) { DockWidth = parentPaneAsPositionableElement.DockWidth, DockHeight = parentPaneAsPositionableElement.DockHeight, DockMinHeight = parentPaneAsPositionableElement.DockMinHeight, DockMinWidth = parentPaneAsPositionableElement.DockMinWidth, FloatingLeft = parentPaneAsPositionableElement.FloatingLeft, FloatingTop = parentPaneAsPositionableElement.FloatingTop, FloatingWidth = parentPaneAsPositionableElement.FloatingWidth, FloatingHeight = parentPaneAsPositionableElement.FloatingHeight, }) }; Layout.FloatingWindows.Add(fw); fwc = new LayoutAnchorableFloatingWindowControl( fw as LayoutAnchorableFloatingWindow) { Width = fwWidth, Height = fwHeight, Left = contentModel.FloatingLeft, Top = contentModel.FloatingTop }; } else { var anchorableDocument = contentModel as LayoutDocument; fw = new LayoutDocumentFloatingWindow() { RootDocument = anchorableDocument }; Layout.FloatingWindows.Add(fw); fwc = new LayoutDocumentFloatingWindowControl( fw as LayoutDocumentFloatingWindow) { Width = fwWidth, Height = fwHeight, Left = contentModel.FloatingLeft, Top = contentModel.FloatingTop }; } //fwc.Owner = Window.GetWindow(this); //fwc.SetParentToMainWindowOf(this); _fwList.Add(fwc); Layout.CollectGarbage(); UpdateLayout(); Dispatcher.BeginInvoke(new Action(() => { if (startDrag) fwc.AttachDrag(); fwc.Show(); }), DispatcherPriority.Send); }