编写拖放装饰器的辅助方法
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