CommandBarDynamicOverflowPage.xaml.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System.Collections.Specialized;
  2. using Avalonia.Controls;
  3. using Avalonia.Interactivity;
  4. namespace ControlCatalog.Pages
  5. {
  6. public partial class CommandBarDynamicOverflowPage : UserControl
  7. {
  8. public CommandBarDynamicOverflowPage()
  9. {
  10. InitializeComponent();
  11. if (SecondaryVisibleCheck.IsChecked != true)
  12. {
  13. DemoBar.SecondaryCommands?.Remove(DemoSecondaryCommand);
  14. }
  15. ((INotifyCollectionChanged)DemoBar.OverflowItems).CollectionChanged += OnOverflowChanged;
  16. ((INotifyCollectionChanged)DemoBar.VisiblePrimaryCommands).CollectionChanged += OnOverflowChanged;
  17. UpdateStatus();
  18. }
  19. private void OnWidthChanged(object? sender, Avalonia.Controls.Primitives.RangeBaseValueChangedEventArgs e)
  20. {
  21. if (BarContainer == null)
  22. return;
  23. var width = (int)WidthSlider.Value;
  24. BarContainer.Width = width;
  25. WidthLabel.Text = $"{width}";
  26. }
  27. private void OnDynamicOverflowChanged(object? sender, RoutedEventArgs e)
  28. {
  29. if (DemoBar == null)
  30. return;
  31. DemoBar.IsDynamicOverflowEnabled = DynamicOverflowCheck.IsChecked == true;
  32. }
  33. private void OnSecondaryVisibilityChanged(object? sender, RoutedEventArgs e)
  34. {
  35. if (DemoBar?.SecondaryCommands == null || DemoSecondaryCommand == null)
  36. return;
  37. bool shouldInclude = SecondaryVisibleCheck.IsChecked == true;
  38. bool isIncluded = DemoBar.SecondaryCommands.Contains(DemoSecondaryCommand);
  39. if (shouldInclude && !isIncluded)
  40. {
  41. DemoBar.SecondaryCommands.Add(DemoSecondaryCommand);
  42. }
  43. else if (!shouldInclude && isIncluded)
  44. {
  45. DemoBar.SecondaryCommands.Remove(DemoSecondaryCommand);
  46. }
  47. UpdateStatus();
  48. }
  49. private void OnOverflowChanged(object? sender, NotifyCollectionChangedEventArgs e)
  50. {
  51. UpdateStatus();
  52. }
  53. private void UpdateStatus()
  54. {
  55. int visiblePrimaryCommandCount = 0;
  56. int visiblePrimarySeparatorCount = 0;
  57. foreach (var item in DemoBar.VisiblePrimaryCommands)
  58. {
  59. if (item is CommandBarSeparator)
  60. visiblePrimarySeparatorCount++;
  61. else
  62. visiblePrimaryCommandCount++;
  63. }
  64. int overflowCommandCount = 0;
  65. int overflowSeparatorCount = 0;
  66. bool hasSyntheticOverflowDivider = false;
  67. foreach (var item in DemoBar.OverflowItems)
  68. {
  69. if (item is CommandBarSeparator separator)
  70. {
  71. overflowSeparatorCount++;
  72. if (!DemoBar.PrimaryCommands.Contains(separator) &&
  73. !DemoBar.SecondaryCommands.Contains(separator))
  74. {
  75. hasSyntheticOverflowDivider = true;
  76. }
  77. }
  78. else
  79. {
  80. overflowCommandCount++;
  81. }
  82. }
  83. StatusText.Text =
  84. $"Visible primary: {visiblePrimaryCommandCount} commands, {visiblePrimarySeparatorCount} separators\n" +
  85. $"Overflow items: {overflowCommandCount} commands, {overflowSeparatorCount} separators\n" +
  86. $"Synthetic overflow divider: {(hasSyntheticOverflowDivider ? "present" : "absent")}";
  87. }
  88. }
  89. }