DragAndDropPage.xaml.cs 3.1 KB

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