This repository has been archived by the owner on Nov 1, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 49
/
Copy pathContextDropBehavior.cs
99 lines (87 loc) · 3 KB
/
ContextDropBehavior.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Xaml.Interactivity;
namespace Avalonia.Xaml.Interactions.DragAndDrop;
/// <summary>
///
/// </summary>
public class ContextDropBehavior : Behavior<Control>
{
/// <summary>
///
/// </summary>
public static string DataFormat = nameof(Context);
/// <summary>
///
/// </summary>
public static readonly StyledProperty<object?> ContextProperty =
AvaloniaProperty.Register<ContextDropBehavior, object?>(nameof(Context));
/// <summary>
///
/// </summary>
public static readonly StyledProperty<IDropHandler?> HandlerProperty =
AvaloniaProperty.Register<ContextDropBehavior, IDropHandler?>(nameof(Handler));
/// <summary>
///
/// </summary>
public object? Context
{
get => GetValue(ContextProperty);
set => SetValue(ContextProperty, value);
}
/// <summary>
///
/// </summary>
public IDropHandler? Handler
{
get => GetValue(HandlerProperty);
set => SetValue(HandlerProperty, value);
}
/// <inheritdoc />
protected override void OnAttachedToVisualTree()
{
if (AssociatedObject is not null)
{
DragDrop.SetAllowDrop(AssociatedObject, true);
}
AssociatedObject?.AddHandler(DragDrop.DragEnterEvent, DragEnter);
AssociatedObject?.AddHandler(DragDrop.DragLeaveEvent, DragLeave);
AssociatedObject?.AddHandler(DragDrop.DragOverEvent, DragOver);
AssociatedObject?.AddHandler(DragDrop.DropEvent, Drop);
}
/// <inheritdoc />
protected override void OnDetachedFromVisualTree()
{
if (AssociatedObject is not null)
{
DragDrop.SetAllowDrop(AssociatedObject, false);
}
AssociatedObject?.RemoveHandler(DragDrop.DragEnterEvent, DragEnter);
AssociatedObject?.RemoveHandler(DragDrop.DragLeaveEvent, DragLeave);
AssociatedObject?.RemoveHandler(DragDrop.DragOverEvent, DragOver);
AssociatedObject?.RemoveHandler(DragDrop.DropEvent, Drop);
}
private void DragEnter(object? sender, DragEventArgs e)
{
var sourceContext = e.Data.Get(ContextDropBehavior.DataFormat);
var targetContext = Context ?? AssociatedObject?.DataContext;
Handler?.Enter(sender, e, sourceContext, targetContext);
}
private void DragLeave(object? sender, RoutedEventArgs e)
{
Handler?.Leave(sender, e);
}
private void DragOver(object? sender, DragEventArgs e)
{
var sourceContext = e.Data.Get(ContextDropBehavior.DataFormat);
var targetContext = Context ?? AssociatedObject?.DataContext;
Handler?.Over(sender, e, sourceContext, targetContext);
}
private void Drop(object? sender, DragEventArgs e)
{
var sourceContext = e.Data.Get(ContextDropBehavior.DataFormat);
var targetContext = Context ?? AssociatedObject?.DataContext;
Handler?.Drop(sender, e, sourceContext, targetContext);
}
}