using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Linq; using Xamarin.Forms; using Xamarin.Forms.Xaml; namespace InABox.Mobile { [XamlCompilation(XamlCompilationOptions.Compile)] public partial class MobileTabStrip { private readonly BindableProperty SelectedBackgroundProperty = BindableProperty.Create( nameof(SelectedBackground), typeof(Color), typeof(MobileTabStrip), XF.Material.Forms.Material.Color.Surface); public Color SelectedBackground { get => (Color)GetValue(SelectedBackgroundProperty); set => SetValue(SelectedBackgroundProperty, value); } private readonly BindableProperty SelectedForegroundProperty = BindableProperty.Create( nameof(SelectedForeground), typeof(Color), typeof(MobileTabStrip), XF.Material.Forms.Material.Color.OnSurface); [TypeConverter(typeof(ColorTypeConverter))] public Color SelectedForeground { get => (Color)GetValue(SelectedForegroundProperty); set => SetValue(SelectedForegroundProperty, value); } private readonly BindableProperty UnselectedBackgroundProperty = BindableProperty.Create( nameof(UnselectedBackground), typeof(Color), typeof(MobileTabStrip), XF.Material.Forms.Material.Color.Primary); [TypeConverter(typeof(ColorTypeConverter))] public Color UnselectedBackground { get => (Color)GetValue(UnselectedBackgroundProperty); set => SetValue(UnselectedBackgroundProperty, value); } private readonly BindableProperty UnselectedForegroundProperty = BindableProperty.Create( nameof(UnselectedForeground), typeof(Color), typeof(MobileTabStrip), XF.Material.Forms.Material.Color.OnPrimary); [TypeConverter(typeof(ColorTypeConverter))] public Color UnselectedForeground { get => (Color)GetValue(UnselectedForegroundProperty); set => SetValue(UnselectedForegroundProperty, value); } private readonly BindableProperty SeparatorColorProperty = BindableProperty.Create( nameof(SeparatorColor), typeof(Color), typeof(MobileTabStrip), XF.Material.Forms.Material.Color.Primary); public Color SeparatorColor { get => (Color)GetValue(SeparatorColorProperty); set => SetValue(SeparatorColorProperty, value); } private readonly BindableProperty CornerRadiusProperty = BindableProperty.Create( nameof(CornerRadius), typeof(float), typeof(MobileTabStrip), 5f); public float CornerRadius { get => (float)GetValue(CornerRadiusProperty); set => SetValue(CornerRadiusProperty, value); } private readonly BindableProperty FontSizeProperty = BindableProperty.Create( nameof(FontSize), typeof(double), typeof(MobileTabStrip), Device.GetNamedSize(NamedSize.Medium, typeof(Label))); [TypeConverter(typeof(FontSizeConverter))] public double FontSize { get => (double)GetValue(FontSizeProperty); set => SetValue(FontSizeProperty, value); } private readonly BindableProperty FontAttributesProperty = BindableProperty.Create( nameof(FontAttributes), typeof(FontAttributes), typeof(MobileTabStrip), FontAttributes.None); public FontAttributes FontAttributes { get => (FontAttributes)GetValue(FontAttributesProperty); set => SetValue(FontAttributesProperty, value); } public MobileTabStripItem SelectedItem { get => Items.FirstOrDefault(x => x.Selected); set { foreach (var item in Items) item.Selected = item == value; } } public event EventHandler SelectionChanged; public IList Items { get; private set; } public MobileTabStrip() { HeightRequest = 50; var items = new ObservableCollection(); items.CollectionChanged += ItemsChanged; Items = items; InitializeComponent(); BindableLayout.SetItemsSource(_grid, Items); } private void ItemsChanged(object sender, NotifyCollectionChangedEventArgs e) { _grid.ColumnDefinitions.Clear(); foreach (var item in Items) { item.Index = _grid.ColumnDefinitions.Count; _grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Star }); } Device.BeginInvokeOnMainThread(() => { SelectedItem ??= Items.FirstOrDefault(); }); } private void DoTap(object sender, EventArgs e) { Device.BeginInvokeOnMainThread(() => { foreach (var item in Items) item.Selected = item == (sender as Label)?.BindingContext; OnPropertyChanged(nameof(Items)); SelectionChanged?.Invoke(this,EventArgs.Empty); }); } } }