From d6d4482a4ee87c6a9492caecf2c4b13d85875f1c Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 6 Aug 2021 20:04:10 +0800 Subject: [PATCH] optimize: use realtime visual to create VisualBrush for drag-drop element --- src/Views/Controls/DragDropAdorner.cs | 12 +++++------- src/Views/Controls/Window.cs | 8 ++++---- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/Views/Controls/DragDropAdorner.cs b/src/Views/Controls/DragDropAdorner.cs index 31126fb2..b3312f38 100644 --- a/src/Views/Controls/DragDropAdorner.cs +++ b/src/Views/Controls/DragDropAdorner.cs @@ -8,8 +8,7 @@ namespace SourceGit.Views.Controls { /// 展示正在拖拽的视图 /// public class DragDropAdorner : Adorner { - private Size renderSize; - private Brush renderBrush; + private FrameworkElement renderElem; public struct PInPoint { public int X; @@ -23,14 +22,13 @@ namespace SourceGit.Views.Controls { static extern void GetCursorPos(ref PInPoint p); public DragDropAdorner(FrameworkElement elem) : base(elem) { - renderSize = elem.RenderSize; - renderBrush = new VisualBrush(elem); + renderElem = elem; IsHitTestVisible = false; Window.AddAdorner(elem, this); } public void Remove() { - Window.RemoveAdorner(this); + Window.RemoveAdorner(renderElem, this); } protected override void OnRender(DrawingContext dc) { @@ -40,11 +38,11 @@ namespace SourceGit.Views.Controls { GetCursorPos(ref p); Point pos = PointFromScreen(new Point(p.X, p.Y)); - Rect rect = new Rect(pos.X, pos.Y, renderSize.Width, renderSize.Height); + Rect rect = new Rect(pos.X, pos.Y, renderElem.RenderSize.Width, renderElem.RenderSize.Height); dc.PushOpacity(1); dc.DrawRectangle(FindResource("Brush.Window") as Brush, null, rect); - dc.DrawRectangle(renderBrush, null, rect); + dc.DrawRectangle(new VisualBrush(renderElem), null, rect); dc.DrawRectangle(null, new Pen(Brushes.DeepSkyBlue, 2), rect); } } diff --git a/src/Views/Controls/Window.cs b/src/Views/Controls/Window.cs index 07aaf767..aaf9c3dd 100644 --- a/src/Views/Controls/Window.cs +++ b/src/Views/Controls/Window.cs @@ -28,16 +28,16 @@ namespace SourceGit.Views.Controls { Loaded += (_, __) => adornerLayer = AdornerLayer.GetAdornerLayer(Content as FrameworkElement); } - public static void AddAdorner(FrameworkElement elem, Adorner adorner) { - var wnd = GetWindow(elem) as Window; + public static void AddAdorner(FrameworkElement windowContext, Adorner adorner) { + var wnd = GetWindow(windowContext) as Window; if (wnd != null && wnd.adornerLayer != null) { wnd.adorners.Add(adorner); wnd.adornerLayer.Add(adorner); } } - public static void RemoveAdorner(Adorner adorner) { - var wnd = GetWindow(adorner) as Window; + public static void RemoveAdorner(FrameworkElement windowContext, Adorner adorner) { + var wnd = GetWindow(windowContext) as Window; if (wnd != null && wnd.adornerLayer != null) { wnd.adorners.Remove(adorner); wnd.adornerLayer.Remove(adorner);