ItemsRepeaterPage.xaml.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using System;
  2. using System.Linq;
  3. using Avalonia.Controls;
  4. using Avalonia.Controls.Primitives;
  5. using Avalonia.Input;
  6. using Avalonia.Layout;
  7. using Avalonia.Markup.Xaml;
  8. using Avalonia.VisualTree;
  9. using ControlCatalog.ViewModels;
  10. namespace ControlCatalog.Pages
  11. {
  12. public class ItemsRepeaterPage : UserControl
  13. {
  14. private readonly ItemsRepeaterPageViewModel _viewModel;
  15. private ItemsRepeater _repeater;
  16. private ScrollViewer _scroller;
  17. private Button _scrollToLast;
  18. private Button _scrollToRandom;
  19. private Random _random = new Random(0);
  20. public ItemsRepeaterPage()
  21. {
  22. this.InitializeComponent();
  23. _repeater = this.FindControl<ItemsRepeater>("repeater");
  24. _scroller = this.FindControl<ScrollViewer>("scroller");
  25. _scrollToLast = this.FindControl<Button>("scrollToLast");
  26. _scrollToRandom = this.FindControl<Button>("scrollToRandom");
  27. _repeater.PointerPressed += RepeaterClick;
  28. _repeater.KeyDown += RepeaterOnKeyDown;
  29. _scrollToLast.Click += scrollToLast_Click;
  30. _scrollToRandom.Click += scrollToRandom_Click;
  31. DataContext = _viewModel = new ItemsRepeaterPageViewModel();
  32. }
  33. private void InitializeComponent()
  34. {
  35. AvaloniaXamlLoader.Load(this);
  36. }
  37. private void LayoutChanged(object sender, SelectionChangedEventArgs e)
  38. {
  39. if (_repeater == null)
  40. {
  41. return;
  42. }
  43. var comboBox = (ComboBox)sender;
  44. switch (comboBox.SelectedIndex)
  45. {
  46. case 0:
  47. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
  48. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
  49. _repeater.Layout = new StackLayout { Orientation = Orientation.Vertical };
  50. break;
  51. case 1:
  52. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
  53. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
  54. _repeater.Layout = new StackLayout { Orientation = Orientation.Horizontal };
  55. break;
  56. case 2:
  57. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
  58. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  59. _repeater.Layout = new UniformGridLayout
  60. {
  61. Orientation = Orientation.Vertical,
  62. MinItemWidth = 200,
  63. MinItemHeight = 200,
  64. };
  65. break;
  66. case 3:
  67. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  68. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
  69. _repeater.Layout = new UniformGridLayout
  70. {
  71. Orientation = Orientation.Horizontal,
  72. MinItemWidth = 200,
  73. MinItemHeight = 200,
  74. };
  75. break;
  76. case 4:
  77. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
  78. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  79. _repeater.Layout = new WrapLayout
  80. {
  81. Orientation = Orientation.Vertical,
  82. HorizontalSpacing = 20,
  83. VerticalSpacing = 20
  84. };
  85. break;
  86. case 5:
  87. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  88. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
  89. _repeater.Layout = new WrapLayout
  90. {
  91. Orientation = Orientation.Horizontal,
  92. HorizontalSpacing = 20,
  93. VerticalSpacing = 20
  94. };
  95. break;
  96. }
  97. }
  98. private void ScrollTo(int index)
  99. {
  100. System.Diagnostics.Debug.WriteLine("Scroll to " + index);
  101. var layoutManager = ((Window)this.GetVisualRoot()).LayoutManager;
  102. var element = _repeater.GetOrCreateElement(index);
  103. layoutManager.ExecuteLayoutPass();
  104. element.BringIntoView();
  105. }
  106. private void RepeaterClick(object sender, PointerPressedEventArgs e)
  107. {
  108. var item = (e.Source as TextBlock)?.DataContext as ItemsRepeaterPageViewModel.Item;
  109. _viewModel.SelectedItem = item;
  110. }
  111. private void RepeaterOnKeyDown(object sender, KeyEventArgs e)
  112. {
  113. if (e.Key == Key.F5)
  114. {
  115. _viewModel.ResetItems();
  116. }
  117. }
  118. private void scrollToLast_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
  119. {
  120. ScrollTo(_viewModel.Items.Count - 1);
  121. }
  122. private void scrollToRandom_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
  123. {
  124. ScrollTo(_random.Next(_viewModel.Items.Count - 1));
  125. }
  126. }
  127. }