MobileTabStrip.xaml.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. public Color SeparatorColor
  62. {
  63. get => (Color)GetValue(SeparatorColorProperty);
  64. set => SetValue(SeparatorColorProperty, value);
  65. }
  66. private readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(
  67. nameof(CornerRadius),
  68. typeof(float),
  69. typeof(MobileTabStrip),
  70. 5f);
  71. public float CornerRadius
  72. {
  73. get => (float)GetValue(CornerRadiusProperty);
  74. set => SetValue(CornerRadiusProperty, value);
  75. }
  76. private readonly BindableProperty FontSizeProperty = BindableProperty.Create(
  77. nameof(FontSize),
  78. typeof(double),
  79. typeof(MobileTabStrip),
  80. Device.GetNamedSize(NamedSize.Medium, typeof(Label)));
  81. [TypeConverter(typeof(FontSizeConverter))]
  82. public double FontSize
  83. {
  84. get => (double)GetValue(FontSizeProperty);
  85. set => SetValue(FontSizeProperty, value);
  86. }
  87. private readonly BindableProperty FontAttributesProperty = BindableProperty.Create(
  88. nameof(FontAttributes),
  89. typeof(FontAttributes),
  90. typeof(MobileTabStrip),
  91. FontAttributes.None);
  92. public FontAttributes FontAttributes
  93. {
  94. get => (FontAttributes)GetValue(FontAttributesProperty);
  95. set => SetValue(FontAttributesProperty, value);
  96. }
  97. public MobileTabStripItem SelectedItem
  98. {
  99. get => Items.FirstOrDefault(x => x.Selected);
  100. set
  101. {
  102. foreach (var item in Items)
  103. item.Selected = item == value;
  104. }
  105. }
  106. public event EventHandler SelectionChanged;
  107. public IList<MobileTabStripItem> Items { get; private set; }
  108. public MobileTabStrip()
  109. {
  110. HeightRequest = 50;
  111. var items = new ObservableCollection<MobileTabStripItem>();
  112. items.CollectionChanged += ItemsChanged;
  113. Items = items;
  114. InitializeComponent();
  115. BindableLayout.SetItemsSource(_grid, Items);
  116. }
  117. private void ItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
  118. {
  119. _grid.ColumnDefinitions.Clear();
  120. foreach (var item in Items)
  121. {
  122. item.Index = _grid.ColumnDefinitions.Count;
  123. _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Star });
  124. }
  125. Device.BeginInvokeOnMainThread(() =>
  126. {
  127. SelectedItem ??= Items.FirstOrDefault();
  128. });
  129. }
  130. private void DoTap(object sender, EventArgs e)
  131. {
  132. Device.BeginInvokeOnMainThread(() =>
  133. {
  134. foreach (var item in Items)
  135. item.Selected = item == (sender as Label)?.BindingContext;
  136. OnPropertyChanged(nameof(Items));
  137. SelectionChanged?.Invoke(this,EventArgs.Empty);
  138. });
  139. }
  140. }
  141. }