DragAndDropPage.xaml.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using Avalonia.Controls;
  2. using Avalonia.Input;
  3. using Avalonia.Markup.Xaml;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. namespace ControlCatalog.Pages
  8. {
  9. public class DragAndDropPage : UserControl
  10. {
  11. private TextBlock _DropState;
  12. private TextBlock _DragState;
  13. private Border _DragMe;
  14. private int DragCount = 0;
  15. public DragAndDropPage()
  16. {
  17. this.InitializeComponent();
  18. _DragMe.PointerPressed += DoDrag;
  19. AddHandler(DragDrop.DropEvent, Drop);
  20. AddHandler(DragDrop.DragOverEvent, DragOver);
  21. }
  22. private async void DoDrag(object sender, Avalonia.Input.PointerPressedEventArgs e)
  23. {
  24. DataObject dragData = new DataObject();
  25. dragData.Set(DataFormats.Text, $"You have dragged text {++DragCount} times");
  26. var result = await DragDrop.DoDragDrop(e, dragData, DragDropEffects.Copy);
  27. switch(result)
  28. {
  29. case DragDropEffects.Copy:
  30. _DragState.Text = "The text was copied"; break;
  31. case DragDropEffects.Link:
  32. _DragState.Text = "The text was linked"; break;
  33. case DragDropEffects.None:
  34. _DragState.Text = "The drag operation was canceled"; break;
  35. }
  36. }
  37. private void DragOver(object sender, DragEventArgs e)
  38. {
  39. // Only allow Copy or Link as Drop Operations.
  40. e.DragEffects = e.DragEffects & (DragDropEffects.Copy | DragDropEffects.Link);
  41. // Only allow if the dragged data contains text or filenames.
  42. if (!e.Data.Contains(DataFormats.Text) && !e.Data.Contains(DataFormats.FileNames))
  43. e.DragEffects = DragDropEffects.None;
  44. }
  45. private void Drop(object sender, DragEventArgs e)
  46. {
  47. if (e.Data.Contains(DataFormats.Text))
  48. _DropState.Text = e.Data.GetText();
  49. else if (e.Data.Contains(DataFormats.FileNames))
  50. _DropState.Text = string.Join(Environment.NewLine, e.Data.GetFileNames());
  51. }
  52. private void InitializeComponent()
  53. {
  54. AvaloniaXamlLoader.Load(this);
  55. _DropState = this.Find<TextBlock>("DropState");
  56. _DragState = this.Find<TextBlock>("DragState");
  57. _DragMe = this.Find<Border>("DragMe");
  58. }
  59. }
  60. }