public void RemoveDropSurface(DropSurface surface) { mDropSurfaces.Remove(surface); //mDropSurfacesWithDragOver.Remove(surface); mAssistWin.HostSurface = null; }
//List<DropSurface> mDropSurfacesWithDragOver = new List<DropSurface>(); //Stack<DropSurface> mDropEnterSurfaceStack = new Stack<DropSurface>(); public void AddDropSurface(DropSurface surface) { if (mDropSurfaces.Contains(surface)) { return; } mDropSurfaces.Add(surface); //var ctrl = surface as DependencyObject; //while(ctrl != null && (!(ctrl is Window))) //{ // ctrl = VisualTreeHelper.GetParent(ctrl); //} //var win = ctrl as Window; //if(win != null) //{ // if (!EditorCommon.Program.ShowedWindows.Contains(win)) // EditorCommon.Program.ShowedWindows.Add(win); //} }
private void MoveDrag(Point point) { //var winPtr = Program.WindowFromPoint((int)point.X, (int)point.Y); if (mMouseWin.DockElement == null) { return; } //if (Mouse.Captured != this) // CaptureMouse(); DropSurface topSurface = null; var groupName = mMouseWin.DockElement.DockGroup; foreach (var surface in mDropSurfaces) { if (surface.SurfaceRect.Contains(point)) { if (groupName != DockableAllGroup && surface.Group != groupName) { continue; } if (topSurface == null) { topSurface = surface; } else { if (surface.HostWin.Topmost == topSurface.HostWin.Topmost) { var surfaceHwnd = new WindowInteropHelper(surface.HostWin).Handle; var topSurfaceHwnd = new WindowInteropHelper(topSurface.HostWin).Handle; if (surfaceHwnd == topSurfaceHwnd) { // 同一窗口 DependencyObject parent = surface; do { parent = VisualTreeHelper.GetParent(parent); }while (parent != null && parent != topSurface); if (parent == topSurface) { topSurface = surface; } } else { var surfaceZOrder = ResourceLibrary.Win32.GetWindowZOrder(surfaceHwnd); var topSurfaceZOrder = ResourceLibrary.Win32.GetWindowZOrder(topSurfaceHwnd); if ((surfaceZOrder > topSurfaceZOrder) || (surface.HostWin.Priority > topSurface.HostWin.Priority)) { topSurface = surface; } } } else if (surface.HostWin.Topmost) { topSurface = surface; } } } } if (mAssistWin.HostSurface != null) { if (topSurface != null) { if (mAssistWin.HostSurface != topSurface) { if (mAssistWin.HostSurface.HostWin.Topmost == topSurface.HostWin.Topmost) { var hostSurfaceHwnd = new WindowInteropHelper(mAssistWin.HostSurface.HostWin).Handle; var hostSurfaceZOrder = ResourceLibrary.Win32.GetWindowZOrder(hostSurfaceHwnd); var topSurfaceHwnd = new WindowInteropHelper(topSurface.HostWin).Handle; var topSurfaceZOrder = ResourceLibrary.Win32.GetWindowZOrder(topSurfaceHwnd); if ((hostSurfaceZOrder < topSurfaceZOrder) || (mAssistWin.HostSurface.HostWin.Priority < topSurface.HostWin.Priority)) { mAssistWin.HostSurface.OnDragLeave(point); mAssistWin.HostSurface = null; topSurface.OnDragEnter(point); mAssistWin.HostSurface = topSurface; } } else if (topSurface.HostWin.Topmost) { mAssistWin.HostSurface.OnDragLeave(point); mAssistWin.HostSurface = null; topSurface.OnDragEnter(point); mAssistWin.HostSurface = topSurface; } } } if (!mAssistWin.HostSurface.SurfaceRect.Contains(point)) { mAssistWin.HostSurface.OnDragLeave(point); mAssistWin.HostSurface = null; } } else { if (topSurface != null) { topSurface.OnDragEnter(point); mAssistWin.HostSurface = topSurface; } } /*foreach (var surface in mDropSurfaces) * { * if (!surface.Active) * continue; * * if (surface.SurfaceRect.Contains(point)) * { * if (!mDropSurfacesWithDragOver.Contains(surface)) * { * mDropSurfacesWithDragOver.Add(surface); * * //var win = Program.GetParent(surface as FrameworkElement, typeof(DockAbleWindow)) as Window; * //if (win == null) * // continue; * * //if(((new System.Windows.Interop.WindowInteropHelper(this)).Handle) == winPtr) * mDropEnterSurfaceStack.Push(surface); * //surface.OnDragEnter(point); * //mAssistWin.HostSurface = surface; * } * else * { * surface.OnDragOver(point); * } * } * else * { * if (mDropSurfacesWithDragOver.Contains(surface)) * { * mDropSurfacesWithDragOver.Remove(surface); * //surface.OnDragLeave(point); * //mAssistWin.HostSurface = null; * } * } * } * * if (mAssistWin.HostSurface != null) * { * if (!mAssistWin.HostSurface.SurfaceRect.Contains(point)) * { * mAssistWin.HostSurface.OnDragLeave(point); * mAssistWin.HostSurface = null; * * while (mDropEnterSurfaceStack.Count > 0) * { * var surface = mDropEnterSurfaceStack.Pop(); * if (surface.SurfaceRect.Contains(point)) * { * surface.OnDragEnter(point); * mAssistWin.HostSurface = surface; * break; * } * } * } * } * else * { * while (mDropEnterSurfaceStack.Count > 0) * { * var surface = mDropEnterSurfaceStack.Pop(); * if (!surface.Active) * continue; * * if (surface.SurfaceRect.Contains(point)) * { * surface.OnDragEnter(point); * mAssistWin.HostSurface = surface; * break; * } * } * }*/ mAssistWin.OnDragOver(point); }