ItemsRepeaterPage.xaml.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. public void OnSelectTemplateKey(object sender, SelectTemplateEventArgs e)
  38. {
  39. var item = (ItemsRepeaterPageViewModel.Item)e.DataContext;
  40. e.TemplateKey = (item.Index % 2 == 0) ? "even" : "odd";
  41. }
  42. private void LayoutChanged(object sender, SelectionChangedEventArgs e)
  43. {
  44. if (_repeater == null)
  45. {
  46. return;
  47. }
  48. var comboBox = (ComboBox)sender;
  49. switch (comboBox.SelectedIndex)
  50. {
  51. case 0:
  52. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
  53. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
  54. _repeater.Layout = new StackLayout { Orientation = Orientation.Vertical };
  55. break;
  56. case 1:
  57. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
  58. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
  59. _repeater.Layout = new StackLayout { Orientation = Orientation.Horizontal };
  60. break;
  61. case 2:
  62. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
  63. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  64. _repeater.Layout = new UniformGridLayout
  65. {
  66. Orientation = Orientation.Vertical,
  67. MinItemWidth = 200,
  68. MinItemHeight = 200,
  69. };
  70. break;
  71. case 3:
  72. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  73. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
  74. _repeater.Layout = new UniformGridLayout
  75. {
  76. Orientation = Orientation.Horizontal,
  77. MinItemWidth = 200,
  78. MinItemHeight = 200,
  79. };
  80. break;
  81. case 4:
  82. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
  83. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
  84. _repeater.Layout = new WrapLayout
  85. {
  86. Orientation = Orientation.Vertical,
  87. HorizontalSpacing = 20,
  88. VerticalSpacing = 20
  89. };
  90. break;
  91. case 5:
  92. _scroller.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
  93. _scroller.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
  94. _repeater.Layout = new WrapLayout
  95. {
  96. Orientation = Orientation.Horizontal,
  97. HorizontalSpacing = 20,
  98. VerticalSpacing = 20
  99. };
  100. break;
  101. }
  102. }
  103. private void ScrollTo(int index)
  104. {
  105. System.Diagnostics.Debug.WriteLine("Scroll to " + index);
  106. var layoutManager = ((Window)this.GetVisualRoot()).LayoutManager;
  107. var element = _repeater.GetOrCreateElement(index);
  108. layoutManager.ExecuteLayoutPass();
  109. element.BringIntoView();
  110. }
  111. private void RepeaterClick(object sender, PointerPressedEventArgs e)
  112. {
  113. var item = (e.Source as TextBlock)?.DataContext as ItemsRepeaterPageViewModel.Item;
  114. _viewModel.SelectedItem = item;
  115. }
  116. private void RepeaterOnKeyDown(object sender, KeyEventArgs e)
  117. {
  118. if (e.Key == Key.F5)
  119. {
  120. _viewModel.ResetItems();
  121. }
  122. }
  123. private void scrollToLast_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
  124. {
  125. ScrollTo(_viewModel.Items.Count - 1);
  126. }
  127. private void scrollToRandom_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
  128. {
  129. ScrollTo(_random.Next(_viewModel.Items.Count - 1));
  130. }
  131. }
  132. }