DragAndDropPage.xaml.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using Avalonia.Controls;
  2. using Avalonia.Input;
  3. using Avalonia.Markup.Xaml;
  4. using System;
  5. using System.Linq;
  6. using System.Reflection;
  7. namespace ControlCatalog.Pages
  8. {
  9. public class DragAndDropPage : UserControl
  10. {
  11. TextBlock _DropState;
  12. private const string CustomFormat = "application/xxx-avalonia-controlcatalog-custom";
  13. public DragAndDropPage()
  14. {
  15. this.InitializeComponent();
  16. _DropState = this.Find<TextBlock>("DropState");
  17. int textCount = 0;
  18. SetupDnd("Text", d => d.Set(DataFormats.Text,
  19. $"Text was dragged {++textCount} times"), DragDropEffects.Copy | DragDropEffects.Move | DragDropEffects.Link);
  20. SetupDnd("Custom", d => d.Set(CustomFormat, "Test123"), DragDropEffects.Move);
  21. SetupDnd("Files", d => d.Set(DataFormats.FileNames, new[] { Assembly.GetEntryAssembly()?.GetModules().FirstOrDefault()?.FullyQualifiedName }), DragDropEffects.Copy);
  22. }
  23. void SetupDnd(string suffix, Action<DataObject> factory, DragDropEffects effects)
  24. {
  25. var dragMe = this.Find<Border>("DragMe" + suffix);
  26. var dragState = this.Find<TextBlock>("DragState"+suffix);
  27. async void DoDrag(object sender, Avalonia.Input.PointerPressedEventArgs e)
  28. {
  29. var dragData = new DataObject();
  30. factory(dragData);
  31. var result = await DragDrop.DoDragDrop(e, dragData, effects);
  32. switch (result)
  33. {
  34. case DragDropEffects.Move:
  35. dragState.Text = "Data was moved";
  36. break;
  37. case DragDropEffects.Copy:
  38. dragState.Text = "Data was copied";
  39. break;
  40. case DragDropEffects.Link:
  41. dragState.Text = "Data was linked";
  42. break;
  43. case DragDropEffects.None:
  44. dragState.Text = "The drag operation was canceled";
  45. break;
  46. default:
  47. dragState.Text = "Unknown result";
  48. break;
  49. }
  50. }
  51. void DragOver(object sender, DragEventArgs e)
  52. {
  53. if (e.Source is Control c && c.Name == "MoveTarget")
  54. {
  55. e.DragEffects = e.DragEffects & (DragDropEffects.Move);
  56. }
  57. else
  58. {
  59. e.DragEffects = e.DragEffects & (DragDropEffects.Copy);
  60. }
  61. // Only allow if the dragged data contains text or filenames.
  62. if (!e.Data.Contains(DataFormats.Text)
  63. && !e.Data.Contains(DataFormats.FileNames)
  64. && !e.Data.Contains(CustomFormat))
  65. e.DragEffects = DragDropEffects.None;
  66. }
  67. void Drop(object sender, DragEventArgs e)
  68. {
  69. if (e.Source is Control c && c.Name == "MoveTarget")
  70. {
  71. e.DragEffects = e.DragEffects & (DragDropEffects.Move);
  72. }
  73. else
  74. {
  75. e.DragEffects = e.DragEffects & (DragDropEffects.Copy);
  76. }
  77. if (e.Data.Contains(DataFormats.Text))
  78. _DropState.Text = e.Data.GetText();
  79. else if (e.Data.Contains(DataFormats.FileNames))
  80. _DropState.Text = string.Join(Environment.NewLine, e.Data.GetFileNames());
  81. else if (e.Data.Contains(CustomFormat))
  82. _DropState.Text = "Custom: " + e.Data.Get(CustomFormat);
  83. }
  84. dragMe.PointerPressed += DoDrag;
  85. AddHandler(DragDrop.DropEvent, Drop);
  86. AddHandler(DragDrop.DragOverEvent, DragOver);
  87. }
  88. private void InitializeComponent()
  89. {
  90. AvaloniaXamlLoader.Load(this);
  91. }
  92. }
  93. }