ContextMenuPage.xaml.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.ComponentModel;
  3. using Avalonia.Controls;
  4. using Avalonia.Interactivity;
  5. using Avalonia.Markup.Xaml;
  6. using ControlCatalog.ViewModels;
  7. namespace ControlCatalog.Pages
  8. {
  9. public class ContextMenuPage : UserControl
  10. {
  11. public ContextMenuPage()
  12. {
  13. this.InitializeComponent();
  14. DataContext = new ContextPageViewModel();
  15. var customContextRequestedBorder = this.Get<Border>("CustomContextRequestedBorder");
  16. customContextRequestedBorder.AddHandler(ContextRequestedEvent, CustomContextRequested, RoutingStrategies.Tunnel);
  17. var cancellableContextBorder = this.Get<Border>("CancellableContextBorder");
  18. cancellableContextBorder.ContextMenu!.ContextMenuClosing += ContextFlyoutPage_Closing;
  19. cancellableContextBorder.ContextMenu!.ContextMenuOpening += ContextFlyoutPage_Opening;
  20. }
  21. private ContextPageViewModel? _model;
  22. protected override void OnDataContextChanged(EventArgs e)
  23. {
  24. if (_model != null)
  25. _model.View = null;
  26. _model = DataContext as ContextPageViewModel;
  27. if (_model != null)
  28. _model.View = this;
  29. base.OnDataContextChanged(e);
  30. }
  31. private void ContextFlyoutPage_Closing(object sender, CancelEventArgs e)
  32. {
  33. var cancelCloseCheckBox = this.FindControl<CheckBox>("CancelCloseCheckBox");
  34. e.Cancel = cancelCloseCheckBox.IsChecked ?? false;
  35. }
  36. private void ContextFlyoutPage_Opening(object sender, EventArgs e)
  37. {
  38. if (e is CancelEventArgs cancelArgs)
  39. {
  40. var cancelCloseCheckBox = this.FindControl<CheckBox>("CancelOpenCheckBox");
  41. cancelArgs.Cancel = cancelCloseCheckBox.IsChecked ?? false;
  42. }
  43. }
  44. public void CustomContextRequested(object sender, ContextRequestedEventArgs e)
  45. {
  46. var border = (Border)sender;
  47. var textBlock = (TextBlock)border.Child;
  48. textBlock.Text = e.TryGetPosition(border, out var point)
  49. ? $"Context was requested with pointer at: {point.X:N0}, {point.Y:N0}"
  50. : "Context was requested without pointer";
  51. e.Handled = true;
  52. }
  53. private void InitializeComponent()
  54. {
  55. AvaloniaXamlLoader.Load(this);
  56. }
  57. }
  58. }