diff --git a/native/Avalonia.Native/src/OSX/dnd.mm b/native/Avalonia.Native/src/OSX/dnd.mm
index 294b8ee8ea..531bdcccfd 100644
--- a/native/Avalonia.Native/src/OSX/dnd.mm
+++ b/native/Avalonia.Native/src/OSX/dnd.mm
@@ -32,7 +32,7 @@ extern NSString* GetAvnCustomDataType()
- (NSDragOperation)draggingSession:(nonnull NSDraggingSession *)session sourceOperationMaskForDraggingContext:(NSDraggingContext)context
{
- return NSDragOperationCopy;
+ return _operation;
}
- (AvnDndSource*) initWithOperation: (NSDragOperation)operation
diff --git a/samples/ControlCatalog/Pages/DragAndDropPage.xaml b/samples/ControlCatalog/Pages/DragAndDropPage.xaml
index c22cf68b68..cd8bf78c88 100644
--- a/samples/ControlCatalog/Pages/DragAndDropPage.xaml
+++ b/samples/ControlCatalog/Pages/DragAndDropPage.xaml
@@ -16,11 +16,16 @@
Drag Me (custom)
+
- Drop some text or files here
+ DragDrop.AllowDrop="True" Name="CopyTarget">
+ Drop some text or files here (Copy)
+
+
+ Drop some text or files here (Move)
diff --git a/samples/ControlCatalog/Pages/DragAndDropPage.xaml.cs b/samples/ControlCatalog/Pages/DragAndDropPage.xaml.cs
index 5a52dbe12b..ae1ec326cd 100644
--- a/samples/ControlCatalog/Pages/DragAndDropPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/DragAndDropPage.xaml.cs
@@ -21,12 +21,12 @@ namespace ControlCatalog.Pages
int textCount = 0;
SetupDnd("Text", d => d.Set(DataFormats.Text,
- $"Text was dragged {++textCount} times"));
+ $"Text was dragged {++textCount} times"), DragDropEffects.Copy | DragDropEffects.Move | DragDropEffects.Link);
- SetupDnd("Custom", d => d.Set(CustomFormat, "Test123"));
+ SetupDnd("Custom", d => d.Set(CustomFormat, "Test123"), DragDropEffects.Move);
}
- void SetupDnd(string suffix, Action factory, DragDropEffects effects = DragDropEffects.Copy)
+ void SetupDnd(string suffix, Action factory, DragDropEffects effects)
{
var dragMe = this.Find("DragMe" + suffix);
var dragState = this.Find("DragState"+suffix);
@@ -36,9 +36,12 @@ namespace ControlCatalog.Pages
var dragData = new DataObject();
factory(dragData);
- var result = await DragDrop.DoDragDrop(e, dragData, DragDropEffects.Copy);
+ var result = await DragDrop.DoDragDrop(e, dragData, effects);
switch (result)
{
+ case DragDropEffects.Move:
+ dragState.Text = "Data was moved";
+ break;
case DragDropEffects.Copy:
dragState.Text = "Data was copied";
break;
@@ -48,13 +51,22 @@ namespace ControlCatalog.Pages
case DragDropEffects.None:
dragState.Text = "The drag operation was canceled";
break;
+ default:
+ dragState.Text = "Unknown result";
+ break;
}
}
void DragOver(object sender, DragEventArgs e)
{
- // Only allow Copy or Link as Drop Operations.
- e.DragEffects = e.DragEffects & (DragDropEffects.Copy | DragDropEffects.Link);
+ if (e.Source is Control c && c.Name == "MoveTarget")
+ {
+ e.DragEffects = e.DragEffects & (DragDropEffects.Move);
+ }
+ else
+ {
+ e.DragEffects = e.DragEffects & (DragDropEffects.Copy);
+ }
// Only allow if the dragged data contains text or filenames.
if (!e.Data.Contains(DataFormats.Text)
@@ -65,6 +77,15 @@ namespace ControlCatalog.Pages
void Drop(object sender, DragEventArgs e)
{
+ if (e.Source is Control c && c.Name == "MoveTarget")
+ {
+ e.DragEffects = e.DragEffects & (DragDropEffects.Move);
+ }
+ else
+ {
+ e.DragEffects = e.DragEffects & (DragDropEffects.Copy);
+ }
+
if (e.Data.Contains(DataFormats.Text))
_DropState.Text = e.Data.GetText();
else if (e.Data.Contains(DataFormats.FileNames))