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))