编写拖放装饰器的辅助方法
This commit is contained in:
		@@ -729,14 +729,7 @@ namespace Deedy.Activity
 | 
				
			|||||||
            if (eventSource is not ActionViewer && eventSource is DependencyObject dobj && this == dobj.FindAncestor<ActionViewer>()) result = true;
 | 
					            if (eventSource is not ActionViewer && eventSource is DependencyObject dobj && this == dobj.FindAncestor<ActionViewer>()) result = true;
 | 
				
			||||||
            return result;
 | 
					            return result;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        protected virtual void RemoveDragAdorner()
 | 
					
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            //TODO:移除拖拽装饰器
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        protected virtual void UpdateDragAdorner(Dock? dock)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            //TODO:更新拖拽装饰器
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        #region 订阅的交互事件
 | 
					        #region 订阅的交互事件
 | 
				
			||||||
        protected override void OnDragEnter(DragEventArgs e)
 | 
					        protected override void OnDragEnter(DragEventArgs e)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -904,7 +897,7 @@ namespace Deedy.Activity
 | 
				
			|||||||
        /// 节点被选中
 | 
					        /// 节点被选中
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
		/// <remarks>
 | 
							/// <remarks>
 | 
				
			||||||
        /// 节点被选中:当视图节点被选中时发生
 | 
					        /// 当视图节点被选中时发生
 | 
				
			||||||
        /// </remarks>
 | 
					        /// </remarks>
 | 
				
			||||||
        public static readonly RoutedEvent SelectedEvent = EventManager.RegisterRoutedEvent("Selected", RoutingStrategy.Bubble,
 | 
					        public static readonly RoutedEvent SelectedEvent = EventManager.RegisterRoutedEvent("Selected", RoutingStrategy.Bubble,
 | 
				
			||||||
            typeof(EventHandler<RoutedEventArgs>), typeof(ActionViewer));
 | 
					            typeof(EventHandler<RoutedEventArgs>), typeof(ActionViewer));
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										71
									
								
								DeedyDesigner/Deedy.Activity/Adorner/DragPlacementAdorner.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								DeedyDesigner/Deedy.Activity/Adorner/DragPlacementAdorner.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using System.Windows;
 | 
				
			||||||
 | 
					using System.Windows.Controls;
 | 
				
			||||||
 | 
					using System.Windows.Documents;
 | 
				
			||||||
 | 
					using System.Windows.Media;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Deedy.Activity
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class DragPlacementAdorner : Adorner
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private static readonly Pen _PrevPen;
 | 
				
			||||||
 | 
					        private static readonly Pen _NextPen;
 | 
				
			||||||
 | 
					        private static readonly Pen _PartPen;
 | 
				
			||||||
 | 
					        public Dock? Position { get; private set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static DragPlacementAdorner()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // 定义装饰器的画笔
 | 
				
			||||||
 | 
					            _PrevPen = new Pen(Brushes.Red, 5.0);
 | 
				
			||||||
 | 
					            _PrevPen.Freeze();
 | 
				
			||||||
 | 
					            _NextPen = new Pen(Brushes.Red, 5.0);
 | 
				
			||||||
 | 
					            _NextPen.Freeze();
 | 
				
			||||||
 | 
					            _PartPen = new Pen(Brushes.Blue, 3.0);
 | 
				
			||||||
 | 
					            _PartPen.Freeze();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public DragPlacementAdorner(UIElement adornedElement, Dock? dock) : base(adornedElement)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            this.Position = dock;
 | 
				
			||||||
 | 
					            IsHitTestVisible = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected override void OnRender(DrawingContext drawingContext)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var adornedElementRect = new Rect(AdornedElement.RenderSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 根据位置信息绘制不同的视觉效果
 | 
				
			||||||
 | 
					            switch (this.Position)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case Dock.Top:
 | 
				
			||||||
 | 
					                    drawingContext.DrawLine(_PrevPen,
 | 
				
			||||||
 | 
					                        new Point(0, 0),
 | 
				
			||||||
 | 
					                        new Point(adornedElementRect.Right, 0));
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case Dock.Bottom:
 | 
				
			||||||
 | 
					                    drawingContext.DrawLine(_NextPen,
 | 
				
			||||||
 | 
					                        new Point(0, adornedElementRect.Bottom),
 | 
				
			||||||
 | 
					                        new Point(adornedElementRect.Right, adornedElementRect.Bottom));
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case Dock.Left:
 | 
				
			||||||
 | 
					                    drawingContext.DrawLine(_PrevPen,
 | 
				
			||||||
 | 
					                        new Point(0, 0),
 | 
				
			||||||
 | 
					                        new Point(0, adornedElementRect.Bottom));
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case Dock.Right:
 | 
				
			||||||
 | 
					                    drawingContext.DrawLine(_NextPen,
 | 
				
			||||||
 | 
					                        new Point(adornedElementRect.Right, 0),
 | 
				
			||||||
 | 
					                        new Point(adornedElementRect.Right, adornedElementRect.Bottom));
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case null:
 | 
				
			||||||
 | 
					                    drawingContext.DrawRectangle(null, _PartPen, adornedElementRect);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                default: break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -7,6 +7,9 @@ using System.Threading.Tasks;
 | 
				
			|||||||
using System.Windows.Media;
 | 
					using System.Windows.Media;
 | 
				
			||||||
using System.Windows;
 | 
					using System.Windows;
 | 
				
			||||||
using System.Runtime.CompilerServices;
 | 
					using System.Runtime.CompilerServices;
 | 
				
			||||||
 | 
					using System.Windows.Controls;
 | 
				
			||||||
 | 
					using System.Windows.Documents;
 | 
				
			||||||
 | 
					using System.Collections.Concurrent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Deedy.Activity
 | 
					namespace Deedy.Activity
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -299,5 +302,51 @@ namespace Deedy.Activity
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "set_ParentElement")]
 | 
					        [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "set_ParentElement")]
 | 
				
			||||||
        private static extern void ActionSetter_ParentElement(BasalAction action, IElement? value);
 | 
					        private static extern void ActionSetter_ParentElement(BasalAction action, IElement? value);
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 拖放装饰层的集合
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        private readonly static ConcurrentDictionary<UIElement, AdornerLayer> AdornerLayers = new();
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 拖放装饰器的集合
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        private readonly static ConcurrentDictionary<UIElement, DragPlacementAdorner> DragAdorners = new();
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 移除一个「UIElement」上的拖放装饰器
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="viewer">目标「UIElement」对象</param>
 | 
				
			||||||
 | 
					        public static void RemoveDragAdorner(this UIElement viewer)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (viewer is null) return;
 | 
				
			||||||
 | 
					            AdornerLayers.Remove(viewer, out var _AdornerLayer);
 | 
				
			||||||
 | 
					            DragAdorners.Remove(viewer, out var _DragAdorner);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (_AdornerLayer != null && _DragAdorner != null)
 | 
				
			||||||
 | 
					                _AdornerLayer.Remove(_DragAdorner);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (_AdornerLayer != null) _AdornerLayer = null;
 | 
				
			||||||
 | 
					            if (_DragAdorner != null) _DragAdorner = null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 更新一个「UIElement」上的拖放装饰器
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="viewer">目标「UIElement」对象</param>
 | 
				
			||||||
 | 
					        /// <param name="dock">画线位置,「null」表示画4面框线</param>
 | 
				
			||||||
 | 
					        public static void UpdateDragAdorner(this UIElement viewer, Dock? dock)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (viewer is null) return;
 | 
				
			||||||
 | 
					            AdornerLayers.Remove(viewer, out var _AdornerLayer);
 | 
				
			||||||
 | 
					            DragAdorners.Remove(viewer, out var _DragAdorner);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (_AdornerLayer != null && _DragAdorner != null)
 | 
				
			||||||
 | 
					                _AdornerLayer.Remove(_DragAdorner);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            _AdornerLayer ??= AdornerLayer.GetAdornerLayer(viewer);
 | 
				
			||||||
 | 
					            if (_AdornerLayer is null) return;
 | 
				
			||||||
 | 
					            _DragAdorner = new DragPlacementAdorner(viewer, dock);
 | 
				
			||||||
 | 
					            _AdornerLayer.Add(_DragAdorner);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            AdornerLayers.TryAdd(viewer, _AdornerLayer);
 | 
				
			||||||
 | 
					            DragAdorners.TryAdd(viewer, _DragAdorner);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user