private static void ProbeDrag(Point screenPos, DragData data) { IDragRecievePoint target = null; var earg = new RecieveDragEventArgs(screenPos); foreach (var window in ZOrderWindows) { var relPos = window.PointFromScreen(screenPos); if (window.InputHitTest(relPos) is UIElement hitPart) { hitPart.RaiseEvent(earg); } if (earg.Handled) { target = earg.RecievePoint; break; } } //Console.WriteLine($"Diff Pos [{screenPos}]:[{relPos}]"); if (LastDragPoint != target) { //Console.WriteLine($"DragTarget [{LastDragPoint}]->[{target}]"); LastDragPoint?.OnDragOut(data, ((FrameworkElement)LastDragPoint).PointFromScreen(screenPos)); target?.OnDragIn(data, ((FrameworkElement)target).PointFromScreen(screenPos)); } LastDragPoint = target; }
private static void OnDraged(DraggingWindow window, Point screenPos, DragData data) { ZOrderWindows = null; //LoacationChanged(Draging) must happen before DragMove finished(Drop) if (LastDragPoint != null) { ((DraggableTabControl)window.Content).RealChildren.Clear(); window.Close(); LastDragPoint.OnDragDrop(data, ((FrameworkElement)LastDragPoint).PointFromScreen(screenPos)); LastDragPoint = null; } else { window.ToNormalWindow(); } }