| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 | 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{    public enum MobileTabStripItemLayout    {        TextOnly,        ImageOnly,        Vertical,        Horizontal    }    public class MobileTabStripDataTemplateSelector : DataTemplateSelector    {                public MobileTabStripItemLayout SelectedLayout { get; set; }                public DataTemplate VerticalTemplate { get; set; }        public DataTemplate HorizontalTemplate { get; set; }        public DataTemplate TextOnlyTemplate { get; set; }        public DataTemplate ImageOnlyTemplate { get; set; }        protected override DataTemplate OnSelectTemplate (object item, BindableObject container)        {            return SelectedLayout switch            {                MobileTabStripItemLayout.ImageOnly => ImageOnlyTemplate,                MobileTabStripItemLayout.Vertical => VerticalTemplate,                MobileTabStripItemLayout.Horizontal => HorizontalTemplate,                _ => TextOnlyTemplate            };        }    }        [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 BorderColorProperty = BindableProperty.Create(            nameof(BorderColor),            typeof(Color),            typeof(MobileTabStrip),            XF.Material.Forms.Material.Color.Primary);                public Color BorderColor        {            get => (Color)GetValue(BorderColorProperty);            set => SetValue(BorderColorProperty, 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.Small, 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);        }                private readonly BindableProperty ItemsLayoutProperty = BindableProperty.Create(            nameof(ItemsLayout),            typeof(MobileTabStripItemLayout),            typeof(MobileTabStrip),            MobileTabStripItemLayout.TextOnly);        public MobileTabStripItemLayout ItemsLayout        {            get => (MobileTabStripItemLayout)GetValue(ItemsLayoutProperty);            set            {                _mobileTabStripDataTemplateSelector.SelectedLayout = value;                SetValue(ItemsLayoutProperty, value);            }        }                private readonly BindableProperty ImageSizeProperty = BindableProperty.Create(            nameof(ImageSize),            typeof(Size),            typeof(MobileTabStrip),            new Size(30,30));        public Size ImageSize        {            get => (Size)GetValue(ImageSizeProperty);            set => SetValue(ImageSizeProperty, 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<MobileTabStripItem> Items { get; private set; }                public MobileTabStrip()        {            HeightRequest = 50;                        var items = new ObservableCollection<MobileTabStripItem>();            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 BindableObject)?.BindingContext;                OnPropertyChanged(nameof(Items));                SelectionChanged?.Invoke(this,EventArgs.Empty);            });        }    }}
 |