public void DragEnd(IDragDropToTabWindow dragWin) { if (dragWin == null) { return; } Win32Helper.Win32Point p = new Win32Helper.Win32Point(); if (!Win32Helper.GetCursorPos(ref p)) { return; } Point dragWinPosition = new Point(p.X, p.Y); foreach (IDragDropToTabWindow targetWin in _dragEnteredWindows) { if (targetWin.IsDragMouseOverTabZone(dragWinPosition)) { System.Windows.Controls.ItemCollection items = ((ITabWindow)dragWin).TabItems; for (int i = 0; i < items.Count; i++) { System.Windows.Controls.TabItem item = items[i] as System.Windows.Controls.TabItem; if (item != null) { ((ITabWindow)targetWin).AddTabItem(item.Header.ToString(), (System.Windows.Controls.Control)item.Content); } } for (int i = items.Count; i > 0; i--) { System.Windows.Controls.TabItem item = items[i - 1] as System.Windows.Controls.TabItem; if (item != null) { ((ITabWindow)dragWin).RemoveTabItem(item); } } } targetWin.OnDrageLeave(); } if (_dragEnteredWindows.Count > 0 && ((ITabWindow)dragWin).TabItems.Count == 0) { ((Window)dragWin).Close(); } _dragEnteredWindows.Clear(); }
void DragSupportTabControl_QueryContinueDrag(object sender, QueryContinueDragEventArgs e) { if (e.KeyStates == DragDropKeyStates.LeftMouseButton) { Console.WriteLine("DragSupportTabControl_QueryContinueDrag - action:{0} {1}", e.Action.ToString(), DateTime.Now.ToLongTimeString()); Win32Helper.Win32Point p = new Win32Helper.Win32Point(); if (Win32Helper.GetCursorPos(ref p)) { Point _tabPos = this.PointToScreen(new Point(0, 0)); if (!((p.X >= _tabPos.X && p.X <= (_tabPos.X + this.ActualWidth) && p.Y >= _tabPos.Y && p.Y <= (_tabPos.Y + this.ActualHeight)))) { var item = e.Source as TabItem; if (item != null) { UpdateWindowLocation(p.X - 50, p.Y - 10, item); } } else { if (this._dragTornWin != null) { UpdateWindowLocation(p.X - 50, p.Y - 10, null); } } } } else if (e.KeyStates == DragDropKeyStates.None) { this.QueryContinueDrag -= DragSupportTabControl_QueryContinueDrag; e.Handled = true; if (this._dragTornWin != null) { _dragTornWin = null; var item = e.Source as TabItem; if (item != null) { this.RemoveTabItem(item); } } } }
public void DragMove(IDragDropToTabWindow dragWin) { if (dragWin == null) { return; } Win32Helper.Win32Point p = new Win32Helper.Win32Point(); if (!Win32Helper.GetCursorPos(ref p)) { return; } Point dragWinPosition = new Point(p.X, p.Y); foreach (IDragDropToTabWindow existWin in _allWindows) { if (dragWin.Equals(existWin)) { continue; } if (existWin.IsDragMouseOver(dragWinPosition)) { if (!_dragEnteredWindows.Contains(existWin)) { _dragEnteredWindows.Add(existWin); } } else { if (_dragEnteredWindows.Contains(existWin)) { _dragEnteredWindows.Remove(existWin); existWin.OnDrageLeave(); } } } if (_dragEnteredWindows.Count > 0) { IntPtr dragWinHwnd = new System.Windows.Interop.WindowInteropHelper((Window)dragWin).Handle; IntPtr dragBelowhwnd = Win32Helper.GetWindow(dragWinHwnd, Win32Helper.GW_HWNDNEXT); IDragDropToTabWindow nextTopWin = null; bool foundTabTarget = false; for (IntPtr hWind = dragBelowhwnd; hWind != IntPtr.Zero; hWind = Win32Helper.GetWindow(hWind, Win32Helper.GW_HWNDNEXT)) { foreach (Window enteredWin in _dragEnteredWindows) { IntPtr enterWinHwnd = new System.Windows.Interop.WindowInteropHelper(enteredWin).Handle; if (hWind == enterWinHwnd) { nextTopWin = (IDragDropToTabWindow)enteredWin; ((IDragDropToTabWindow)enteredWin).OnDragEnter(); foundTabTarget = true; break; } } if (foundTabTarget) { break; } } if (nextTopWin != null) { foreach (Window enteredWin in _dragEnteredWindows) { if (!nextTopWin.Equals(enteredWin)) { ((IDragDropToTabWindow)enteredWin).OnDrageLeave(); } } if (nextTopWin.IsDragMouseOverTabZone(dragWinPosition)) { ((Window)dragWin).Hide(); } else { ((Window)dragWin).Show(); } } } else { if (!((Window)dragWin).IsVisible) { ((Window)dragWin).Show(); } } }