/// <summary> /// Tries to move the dragged items from the <see cref="FloatWindow"/> into a /// <see cref="DockTabPanel"/>. /// </summary> private void DragFloatWindowIntoDockTabPanel() { Debug.Assert(_targetDockTabPane == null); Debug.Assert(_floatWindow != null); var dockTabPane = GetTargetPane() as DockTabPane; if (dockTabPane == null) { return; // No DockTabPane (view). } var dockTabPaneVM = dockTabPane.GetViewModel(); if (dockTabPaneVM == null) { return; // No IDockTabPane (view-model). } if (GetDockTabItemAtMouse(dockTabPane) == null) { return; // No DockTabItem hit. } if (!CanDock(dockTabPaneVM, DockPosition.Inside)) { return; // Docking not allowed. } // Remove currently dragged FloatWindow. var floatWindowVM = _floatWindow.GetViewModel(); foreach (var item in _draggedItems) { DockHelper.Remove(floatWindowVM, item); } _floatWindow = null; Win32.ReleaseCapture(); // Exit Win32 move window loop. // Add items into target DockTabPane. _targetDockTabPane = dockTabPane; foreach (var item in _draggedItems) { item.DockState = dockTabPaneVM.DockState; dockTabPaneVM.Items.Add(item); } // Make sure the current item is selected in DockTabPane. _dockStrategy.Activate(_activeItem); // When the Win32 move window loop exits, the DockControl receives a LostMouseCapture // event. --> Defer dragging of the DockTabItems. _dockControl.Dispatcher.BeginInvoke(new Action(() => { if (!_dockControl.IsMouseCaptured) { if (!_dockControl.CaptureMouse()) { // Failed to capture the mouse. EndDrag(false); return; } _dockControl.LostMouseCapture += OnLostMouseCapture; _dockControl.MouseMove += OnMouseMove; _dockControl.MouseLeftButtonUp += OnMouseLeftButtonUp; _dockControl.PreviewKeyDown += OnPreviewKeyDown; _targetDockTabPane.PreviewKeyDown += OnPreviewKeyDown; DragDockTabItems(); } })); HideBorderDockIndicators(); HidePaneIndicators(); _dockControl.UpdateFloatWindows(); _layoutChanged = true; }