ContextFlyoutPage.xaml.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. var flyout = (Flyout)cancellableContextBorder.ContextFlyout!;
  30. flyout.Closing += ContextFlyoutPage_Closing;
  31. flyout.Opening += ContextFlyoutPage_Opening;
  32. }
  33. private ContextPageViewModel? _model;
  34. protected override void OnDataContextChanged(EventArgs e)
  35. {
  36. if (_model != null)
  37. _model.View = null;
  38. _model = DataContext as ContextPageViewModel;
  39. if (_model != null)
  40. _model.View = this;
  41. base.OnDataContextChanged(e);
  42. }
  43. private void ContextFlyoutPage_Closing(object? sender, CancelEventArgs e)
  44. {
  45. var cancelCloseCheckBox = this.FindControl<CheckBox>("CancelCloseCheckBox");
  46. e.Cancel = cancelCloseCheckBox?.IsChecked ?? false;
  47. }
  48. private void ContextFlyoutPage_Opening(object? sender, EventArgs e)
  49. {
  50. if (e is CancelEventArgs cancelArgs)
  51. {
  52. var cancelCloseCheckBox = this.FindControl<CheckBox>("CancelOpenCheckBox");
  53. cancelArgs.Cancel = cancelCloseCheckBox?.IsChecked ?? false;
  54. }
  55. }
  56. private void CloseFlyout(object? sender, RoutedEventArgs e)
  57. {
  58. _textBox.ContextFlyout?.Hide();
  59. }
  60. public void CustomContextRequested(object? sender, ContextRequestedEventArgs e)
  61. {
  62. if (sender is Border border && border.Child is TextBlock textBlock)
  63. {
  64. textBlock.Text = e.TryGetPosition(border, out var point)
  65. ? $"Context was requested with pointer at: {point.X:N0}, {point.Y:N0}"
  66. : "Context was requested without pointer";
  67. e.Handled = true;
  68. }
  69. }
  70. private void InitializeComponent()
  71. {
  72. AvaloniaXamlLoader.Load(this);
  73. }
  74. }
  75. }