ExpanderView.xaml.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. using Xamarin.CommunityToolkit.UI.Views;
  6. using Xamarin.Forms;
  7. using Xamarin.Forms.Xaml;
  8. namespace comal.timesheets
  9. {
  10. public delegate void ExpanderViewSelectionChanged(object sender, EventArgs args);
  11. [XamlCompilation(XamlCompilationOptions.Compile)]
  12. public partial class ExpanderView : ContentView
  13. {
  14. private ExpanderViewData _data;
  15. public ExpanderViewData Data
  16. {
  17. get => _data;
  18. set
  19. {
  20. _data = value;
  21. Load();
  22. }
  23. }
  24. public Color SelectedColor { get; set; }
  25. public Color UnselectedColor { get; set; }
  26. public event ExpanderViewSelectionChanged SelectionChanged;
  27. public ExpanderView()
  28. {
  29. InitializeComponent();
  30. SelectedColor = Color.Red;
  31. UnselectedColor = Color.Silver;
  32. }
  33. public void Load()
  34. {
  35. Stack.Children.Clear();
  36. if (Data == null)
  37. return;
  38. foreach (var group in Data.Groups)
  39. {
  40. var expander = new Expander();
  41. expander.HorizontalOptions = LayoutOptions.Start;
  42. expander.Header = CreateHeader(group,(o, e) =>
  43. {
  44. (o as Frame).Margin = new Thickness(0, 0, expander.IsExpanded ? 0 : 10, 0);
  45. foreach (var exp in Stack.Children.Where(x => x != expander))
  46. exp.IsVisible = expander.IsExpanded;
  47. expander.ForceUpdateSize();
  48. if (!expander.IsExpanded)
  49. Scroll.ScrollToAsync(0, 0, false);
  50. else
  51. Scroll.ScrollToAsync(expander, ScrollToPosition.MakeVisible, false);
  52. });
  53. expander.Content = CreateList(group);
  54. Stack.Children.Add(expander);
  55. }
  56. }
  57. private ContentView CreateHeader(ExpanderViewGroup group, EventHandler ontapped)
  58. {
  59. Frame frame = new Frame();
  60. frame.BackgroundColor = Color.White;
  61. frame.HasShadow = false;
  62. frame.CornerRadius = 15;
  63. frame.BorderColor = Color.Black;
  64. frame.Padding = new Thickness(5, 5, 10, 5);
  65. frame.HorizontalOptions = LayoutOptions.Fill;
  66. frame.MinimumHeightRequest = 40;
  67. TapGestureRecognizer headerTap = new TapGestureRecognizer() { NumberOfTapsRequired = 1 };
  68. headerTap.Tapped += ontapped;
  69. frame.GestureRecognizers.Add(headerTap);
  70. Grid grid = new Grid();
  71. grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
  72. grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
  73. if (group.Image != null)
  74. {
  75. Image image = new Image() { Source = group.Image };
  76. image.WidthRequest = 30;
  77. image.HeightRequest = 30;
  78. image.SetValue(Grid.ColumnProperty, 0);
  79. grid.Children.Add(image);
  80. }
  81. Label label = new Label()
  82. {
  83. Text = group.Description,
  84. FontAttributes = FontAttributes.Bold,
  85. VerticalTextAlignment = TextAlignment.Center,
  86. HorizontalTextAlignment = TextAlignment.Center
  87. };
  88. label.FontSize = 18;
  89. label.SetValue(Grid.ColumnProperty, 1);
  90. grid.Children.Add(label);
  91. frame.Content = grid;
  92. return frame;
  93. }
  94. private View CreateList(ExpanderViewGroup group)
  95. {
  96. ListView result = new ListView();
  97. result.SelectionMode = ListViewSelectionMode.None;
  98. result.HorizontalOptions = LayoutOptions.Fill;
  99. result.ItemTemplate = new DataTemplate(() =>
  100. {
  101. Button button = new Button();
  102. button.SetBinding(Button.TextProperty, "Description");
  103. button.Clicked += ExpanderViewItem_Clicked;
  104. button.MinimumHeightRequest = 40;
  105. button.TextColor = Color.Black;
  106. button.CornerRadius = 15;
  107. button.BorderColor = UnselectedColor;
  108. button.BackgroundColor = UnselectedColor;
  109. button.Margin = new Thickness(2, 2, 10, 2);
  110. button.HorizontalOptions = LayoutOptions.Fill;
  111. return new ViewCell { View = button };
  112. });
  113. result.ItemsSource = group.Items;
  114. return result;
  115. }
  116. private void ExpanderViewItem_Clicked(object sender, EventArgs e)
  117. {
  118. var button = (sender as Button);
  119. var item = button.BindingContext as ExpanderViewItem;
  120. item.Selected = !item.Selected;
  121. button.BackgroundColor = item.Selected ? SelectedColor : UnselectedColor;
  122. button.BorderColor = button.BackgroundColor;
  123. SelectionChanged?.Invoke(this,new EventArgs());
  124. }
  125. }
  126. }