MobileTabStrip.xaml.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Collections.Specialized;
  5. using System.Linq;
  6. using Xamarin.Forms;
  7. using Xamarin.Forms.Xaml;
  8. namespace InABox.Mobile
  9. {
  10. [XamlCompilation(XamlCompilationOptions.Compile)]
  11. public partial class MobileTabStrip
  12. {
  13. private readonly BindableProperty SelectedBackgroundProperty = BindableProperty.Create(
  14. nameof(SelectedBackground),
  15. typeof(Color),
  16. typeof(MobileTabStrip),
  17. XF.Material.Forms.Material.Color.Surface);
  18. public Color SelectedBackground
  19. {
  20. get => (Color)GetValue(SelectedBackgroundProperty);
  21. set => SetValue(SelectedBackgroundProperty, value);
  22. }
  23. private readonly BindableProperty SelectedForegroundProperty = BindableProperty.Create(
  24. nameof(SelectedForeground),
  25. typeof(Color),
  26. typeof(MobileTabStrip),
  27. XF.Material.Forms.Material.Color.OnSurface);
  28. [TypeConverter(typeof(ColorTypeConverter))]
  29. public Color SelectedForeground
  30. {
  31. get => (Color)GetValue(SelectedForegroundProperty);
  32. set => SetValue(SelectedForegroundProperty, value);
  33. }
  34. private readonly BindableProperty UnselectedBackgroundProperty = BindableProperty.Create(
  35. nameof(UnselectedBackground),
  36. typeof(Color),
  37. typeof(MobileTabStrip),
  38. XF.Material.Forms.Material.Color.Primary);
  39. [TypeConverter(typeof(ColorTypeConverter))]
  40. public Color UnselectedBackground
  41. {
  42. get => (Color)GetValue(UnselectedBackgroundProperty);
  43. set => SetValue(UnselectedBackgroundProperty, value);
  44. }
  45. private readonly BindableProperty UnselectedForegroundProperty = BindableProperty.Create(
  46. nameof(UnselectedForeground),
  47. typeof(Color),
  48. typeof(MobileTabStrip),
  49. XF.Material.Forms.Material.Color.OnPrimary);
  50. [TypeConverter(typeof(ColorTypeConverter))]
  51. public Color UnselectedForeground
  52. {
  53. get => (Color)GetValue(UnselectedForegroundProperty);
  54. set => SetValue(UnselectedForegroundProperty, value);
  55. }
  56. // private readonly BindableProperty SeparatorColorProperty = BindableProperty.Create(
  57. // nameof(SeparatorColor),
  58. // typeof(Color),
  59. // typeof(MobileTabStrip),
  60. // XF.Material.Forms.Material.Color.Primary);
  61. //
  62. // public Color SeparatorColor
  63. // {
  64. // get => (Color)GetValue(SeparatorColorProperty);
  65. // set => SetValue(SeparatorColorProperty, value);
  66. // }
  67. private readonly BindableProperty BorderColorProperty = BindableProperty.Create(
  68. nameof(BorderColor),
  69. typeof(Color),
  70. typeof(MobileTabStrip),
  71. XF.Material.Forms.Material.Color.Primary);
  72. public Color BorderColor
  73. {
  74. get => (Color)GetValue(BorderColorProperty);
  75. set => SetValue(BorderColorProperty, value);
  76. }
  77. private readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(
  78. nameof(CornerRadius),
  79. typeof(float),
  80. typeof(MobileTabStrip),
  81. 5f);
  82. public float CornerRadius
  83. {
  84. get => (float)GetValue(CornerRadiusProperty);
  85. set => SetValue(CornerRadiusProperty, value);
  86. }
  87. private readonly BindableProperty FontSizeProperty = BindableProperty.Create(
  88. nameof(FontSize),
  89. typeof(double),
  90. typeof(MobileTabStrip),
  91. Device.GetNamedSize(NamedSize.Small, typeof(Label)));
  92. [TypeConverter(typeof(FontSizeConverter))]
  93. public double FontSize
  94. {
  95. get => (double)GetValue(FontSizeProperty);
  96. set => SetValue(FontSizeProperty, value);
  97. }
  98. private readonly BindableProperty FontAttributesProperty = BindableProperty.Create(
  99. nameof(FontAttributes),
  100. typeof(FontAttributes),
  101. typeof(MobileTabStrip),
  102. FontAttributes.None);
  103. public FontAttributes FontAttributes
  104. {
  105. get => (FontAttributes)GetValue(FontAttributesProperty);
  106. set => SetValue(FontAttributesProperty, value);
  107. }
  108. public MobileTabStripItem SelectedItem
  109. {
  110. get => Items.FirstOrDefault(x => x.Selected);
  111. set
  112. {
  113. foreach (var item in Items)
  114. item.Selected = item == value;
  115. }
  116. }
  117. public event EventHandler SelectionChanged;
  118. public IList<MobileTabStripItem> Items { get; private set; }
  119. public MobileTabStrip()
  120. {
  121. HeightRequest = 50;
  122. var items = new ObservableCollection<MobileTabStripItem>();
  123. items.CollectionChanged += ItemsChanged;
  124. Items = items;
  125. InitializeComponent();
  126. BindableLayout.SetItemsSource(_grid, Items);
  127. }
  128. private void ItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
  129. {
  130. _grid.ColumnDefinitions.Clear();
  131. foreach (var item in Items)
  132. {
  133. item.Index = _grid.ColumnDefinitions.Count;
  134. _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Star });
  135. }
  136. Device.BeginInvokeOnMainThread(() =>
  137. {
  138. SelectedItem ??= Items.FirstOrDefault();
  139. });
  140. }
  141. private void DoTap(object sender, EventArgs e)
  142. {
  143. Device.BeginInvokeOnMainThread(() =>
  144. {
  145. foreach (var item in Items)
  146. item.Selected = item == (sender as Label)?.BindingContext;
  147. OnPropertyChanged(nameof(Items));
  148. SelectionChanged?.Invoke(this,EventArgs.Empty);
  149. });
  150. }
  151. }
  152. }