ContextFlyoutPage.xaml.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using Avalonia;
  2. using Avalonia.Controls;
  3. using Avalonia.Markup.Xaml;
  4. using ControlCatalog.ViewModels;
  5. using Avalonia.Interactivity;
  6. using System;
  7. using System.ComponentModel;
  8. namespace ControlCatalog.Pages
  9. {
  10. public class ContextFlyoutPage : UserControl
  11. {
  12. private TextBox _textBox;
  13. public ContextFlyoutPage()
  14. {
  15. InitializeComponent();
  16. DataContext = new ContextPageViewModel();
  17. _textBox = this.Get<TextBox>("TextBox");
  18. var cutButton = this.Get<Button>("CutButton");
  19. cutButton.Click += CloseFlyout;
  20. var copyButton = this.Get<Button>("CopyButton");
  21. copyButton.Click += CloseFlyout;
  22. var pasteButton = this.Get<Button>("PasteButton");
  23. pasteButton.Click += CloseFlyout;
  24. var clearButton = this.Get<Button>("ClearButton");
  25. clearButton.Click += CloseFlyout;
  26. var customContextRequestedBorder = this.Get<Border>("CustomContextRequestedBorder");
  27. customContextRequestedBorder.AddHandler(ContextRequestedEvent, CustomContextRequested, RoutingStrategies.Tunnel);
  28. var cancellableContextBorder = this.Get<Border>("CancellableContextBorder");
  29. cancellableContextBorder.ContextFlyout!.Closing += ContextFlyoutPage_Closing;
  30. cancellableContextBorder.ContextFlyout!.Opening += ContextFlyoutPage_Opening;
  31. }
  32. private ContextPageViewModel? _model;
  33. protected override void OnDataContextChanged(EventArgs e)
  34. {
  35. if (_model != null)
  36. _model.View = null;
  37. _model = DataContext as ContextPageViewModel;
  38. if (_model != null)
  39. _model.View = this;
  40. base.OnDataContextChanged(e);
  41. }
  42. private void ContextFlyoutPage_Closing(object? sender, CancelEventArgs e)
  43. {
  44. var cancelCloseCheckBox = this.FindControl<CheckBox>("CancelCloseCheckBox");
  45. e.Cancel = cancelCloseCheckBox?.IsChecked ?? false;
  46. }
  47. private void ContextFlyoutPage_Opening(object? sender, EventArgs e)
  48. {
  49. if (e is CancelEventArgs cancelArgs)
  50. {
  51. var cancelCloseCheckBox = this.FindControl<CheckBox>("CancelOpenCheckBox");
  52. cancelArgs.Cancel = cancelCloseCheckBox?.IsChecked ?? false;
  53. }
  54. }
  55. private void CloseFlyout(object? sender, RoutedEventArgs e)
  56. {
  57. _textBox.ContextFlyout?.Hide();
  58. }
  59. public void CustomContextRequested(object? sender, ContextRequestedEventArgs e)
  60. {
  61. if (sender is Border border && border.Child is TextBlock textBlock)
  62. {
  63. textBlock.Text = e.TryGetPosition(border, out var point)
  64. ? $"Context was requested with pointer at: {point.X:N0}, {point.Y:N0}"
  65. : "Context was requested without pointer";
  66. e.Handled = true;
  67. }
  68. }
  69. private void InitializeComponent()
  70. {
  71. AvaloniaXamlLoader.Load(this);
  72. }
  73. }
  74. }