NavigationPageEventsPage.xaml.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System.Threading.Tasks;
  2. using Avalonia.Controls;
  3. using Avalonia.Interactivity;
  4. using Avalonia.Media;
  5. namespace ControlCatalog.Pages
  6. {
  7. public partial class NavigationPageEventsPage : UserControl
  8. {
  9. private bool _initialized;
  10. private int _pageCount;
  11. public NavigationPageEventsPage()
  12. {
  13. InitializeComponent();
  14. Loaded += OnLoaded;
  15. }
  16. private async void OnLoaded(object? sender, RoutedEventArgs e)
  17. {
  18. if (_initialized)
  19. return;
  20. _initialized = true;
  21. DemoNav.Pushed += (s, ev) => AddLog($"Pushed → {ev.Page?.Header}");
  22. DemoNav.Popped += (s, ev) => AddLog($"Popped ← {ev.Page?.Header}");
  23. DemoNav.PoppedToRoot += (s, ev) => AddLog("PoppedToRoot");
  24. DemoNav.PageInserted += (s, ev) => AddLog($"PageInserted: {ev.Page?.Header}");
  25. DemoNav.PageRemoved += (s, ev) => AddLog($"PageRemoved: {ev.Page?.Header}");
  26. DemoNav.ModalPushed += (s, ev) => AddLog($"ModalPushed → {ev.Modal?.Header}");
  27. DemoNav.ModalPopped += (s, ev) => AddLog($"ModalPopped ← {ev.Modal?.Header}");
  28. var root = NavigationDemoHelper.MakePage("Home", "Push pages and watch the event log.\nAll navigation events are captured.", 0);
  29. SubscribePage(root);
  30. await DemoNav.PushAsync(root, null);
  31. }
  32. private void SubscribePage(ContentPage page)
  33. {
  34. page.NavigatedTo += (s, e) => AddLog($"[{page.Header}] NavigatedTo");
  35. page.NavigatedFrom += (s, e) => AddLog($"[{page.Header}] NavigatedFrom");
  36. page.Navigating += args =>
  37. {
  38. AddLog($"[{page.Header}] Navigating");
  39. return System.Threading.Tasks.Task.CompletedTask;
  40. };
  41. }
  42. private async void OnPush(object? sender, RoutedEventArgs e)
  43. {
  44. _pageCount++;
  45. var page = NavigationDemoHelper.MakePage($"Page {_pageCount}", "Navigate back to see events.", _pageCount);
  46. SubscribePage(page);
  47. await DemoNav.PushAsync(page);
  48. }
  49. private async void OnPop(object? sender, RoutedEventArgs e) => await DemoNav.PopAsync();
  50. private async void OnPopToRoot(object? sender, RoutedEventArgs e) => await DemoNav.PopToRootAsync();
  51. private void OnInsertPage(object? sender, RoutedEventArgs e)
  52. {
  53. if (DemoNav.CurrentPage == null)
  54. return;
  55. _pageCount++;
  56. var page = NavigationDemoHelper.MakePage($"Inserted {_pageCount}", "Inserted below the current page.", _pageCount);
  57. SubscribePage(page);
  58. DemoNav.InsertPage(page, DemoNav.CurrentPage);
  59. }
  60. private void OnRemovePage(object? sender, RoutedEventArgs e)
  61. {
  62. var stack = DemoNav.NavigationStack;
  63. if (stack.Count < 2)
  64. return;
  65. DemoNav.RemovePage(stack[stack.Count - 2]);
  66. }
  67. private async void OnPushModal(object? sender, RoutedEventArgs e)
  68. {
  69. _pageCount++;
  70. var page = NavigationDemoHelper.MakePage($"Modal {_pageCount}", "Dismiss to see ModalPopped event.", _pageCount);
  71. SubscribePage(page);
  72. await DemoNav.PushModalAsync(page);
  73. }
  74. private async void OnPopModal(object? sender, RoutedEventArgs e) => await DemoNav.PopModalAsync();
  75. private void OnClearLog(object? sender, RoutedEventArgs e)
  76. {
  77. LogPanel.Children.Clear();
  78. }
  79. private void AddLog(string message)
  80. {
  81. LogPanel.Children.Insert(0, new TextBlock
  82. {
  83. Text = message,
  84. FontFamily = new FontFamily("Cascadia Code,Consolas,Menlo,monospace"),
  85. FontSize = 11,
  86. TextWrapping = TextWrapping.Wrap,
  87. Margin = new Avalonia.Thickness(0, 1),
  88. });
  89. }
  90. }
  91. }