Quellcode durchsuchen

MobileTabStrip now allows images as well as text
Fixed Issues with Mobile Date and Time Buttons
MobileButtons now defaults to rounded corners
ICoreRepository.Search() now returns itself

Frank van den Bos vor 1 Jahr
Ursprung
Commit
c4145c17a1

+ 7 - 2
InABox.Core/CoreUtils.cs

@@ -85,6 +85,7 @@ namespace InABox.Core
         v20_2,
         v20_2,
         v20_3,
         v20_3,
         v22_1,
         v22_1,
+        v23_1,
         Unspecified
         Unspecified
     }
     }
 
 
@@ -166,8 +167,12 @@ namespace InABox.Core
                     "NzY3MzEzQDMyMzAyZTMzMmUzMGR2bk5Bb1lOK2pJV2lLdys4YlVDMGViYUhCY21PM2xITTRWZlhYYmRlVm89;NzY3MzE0QDMyMzAyZTMzMmUzMG9vSEdIY1d1NDFPYjBGSnJMcTlQSmpMUzYwNk9HZUNXWHNJZWlXZloyT0U9"
                     "NzY3MzEzQDMyMzAyZTMzMmUzMGR2bk5Bb1lOK2pJV2lLdys4YlVDMGViYUhCY21PM2xITTRWZlhYYmRlVm89;NzY3MzE0QDMyMzAyZTMzMmUzMG9vSEdIY1d1NDFPYjBGSnJMcTlQSmpMUzYwNk9HZUNXWHNJZWlXZloyT0U9"
                 },
                 },
                 {
                 {
-                        SyncfusionVersion.v22_1,
-                        "MjU0OTIyM0AzMjMyMmUzMDJlMzBhMTc2SkUzUFkyUzcyUFVhNzFLWDRCOElLTkVjQ2JQOG9zZ09CUTBuZjN3PQ==;MjU0OTIyNEAzMjMyMmUzMDJlMzBtaG5naUZPVVRwdENBWGRNSDdYK3orQ3NCcjVkYjRVUzQ4ZHoyRkloeStVPQ==;MjU0OTIyNUAzMjMyMmUzMDJlMzBtaG5naUZPVVRwdENBWGRNSDdYK3orQ3NCcjVkYjRVUzQ4ZHoyRkloeStVPQ=="
+                    SyncfusionVersion.v22_1,
+                    "MjU0OTIyM0AzMjMyMmUzMDJlMzBhMTc2SkUzUFkyUzcyUFVhNzFLWDRCOElLTkVjQ2JQOG9zZ09CUTBuZjN3PQ==;MjU0OTIyNEAzMjMyMmUzMDJlMzBtaG5naUZPVVRwdENBWGRNSDdYK3orQ3NCcjVkYjRVUzQ4ZHoyRkloeStVPQ==;MjU0OTIyNUAzMjMyMmUzMDJlMzBtaG5naUZPVVRwdENBWGRNSDdYK3orQ3NCcjVkYjRVUzQ4ZHoyRkloeStVPQ=="
+                },
+                {
+                    SyncfusionVersion.v23_1,
+                    "MjgwNDUxMkAzMjMzMmUzMDJlMzBlYjFtTGpVVkFBVjB5K0VXWXJBazhXa3htWGFQMnJuK0txb0VTL2EycmlBPQ==;MjgwNDUxM0AzMjMzMmUzMDJlMzBXTC9sRzg4aFV1VU1uS1F5a1UrZHdFSzMxaFFsYVpPbDlsc0F5OVNEVFhJPQ==;MjgwNDUxNEAzMjMzMmUzMDJlMzBXTC9sRzg4aFV1VU1uS1F5a1UrZHdFSzMxaFFsYVpPbDlsc0F5OVNEVFhJPQ=="
                 },
                 },
                 {
                 {
                     SyncfusionVersion.Unspecified,
                     SyncfusionVersion.Unspecified,

+ 2 - 1
InABox.Mobile/InABox.Mobile.Shared/Components/MobileButton/MobileButton.xaml.cs

@@ -78,7 +78,8 @@ namespace InABox.Mobile
         public static readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(
         public static readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(
             nameof(CornerRadius), 
             nameof(CornerRadius), 
             typeof(float), 
             typeof(float), 
-            typeof(MobileButton));
+            typeof(MobileButton),
+            5.0f);
         
         
         public float CornerRadius 
         public float CornerRadius 
         {
         {

+ 0 - 1
InABox.Mobile/InABox.Mobile.Shared/Components/MobileDateSelector/MobileDateSelector.xaml.cs

@@ -1,5 +1,4 @@
 using System;
 using System;
-using Syncfusion.XForms.Pickers;
 using Xamarin.Forms.Xaml;
 using Xamarin.Forms.Xaml;
 
 
 namespace InABox.Mobile
 namespace InABox.Mobile

+ 243 - 56
InABox.Mobile/InABox.Mobile.Shared/Components/MobileTabStrip/MobileTabStrip.xaml

@@ -3,9 +3,239 @@
 <ContentView xmlns="http://xamarin.com/schemas/2014/forms"
 <ContentView xmlns="http://xamarin.com/schemas/2014/forms"
              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
              xmlns:mobile="clr-namespace:InABox.Mobile;assembly=InABox.Mobile.Shared"
              xmlns:mobile="clr-namespace:InABox.Mobile;assembly=InABox.Mobile.Shared"
-             xmlns:ui="clr-namespace:XF.Material.Forms.UI;assembly=XF.Material"
              x:Class="InABox.Mobile.MobileTabStrip"
              x:Class="InABox.Mobile.MobileTabStrip"
              x:DataType="mobile:MobileTabStrip">
              x:DataType="mobile:MobileTabStrip">
+    
+    <ContentView.Resources>
+        <ResourceDictionary>
+            
+            <DataTemplate x:Key="VerticalTemplate" x:DataType="mobile:MobileTabStripItem">
+                <Frame
+                    Grid.Column="{Binding Index}"
+                    HasShadow="False" 
+                    Margin="0" 
+                    Padding="5"
+                    BorderColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    CornerRadius="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='CornerRadius'}"
+                    IsClippedToBounds="True"
+                    VerticalOptions="Fill"
+                    HorizontalOptions="Fill">
+                    
+                    <Frame.GestureRecognizers>
+                        <TapGestureRecognizer Tapped="DoTap"/>
+                    </Frame.GestureRecognizers>
+                    
+                    <Frame.Triggers>
+                        <DataTrigger TargetType="Frame" Binding="{Binding Selected}" Value="True">
+                            <Setter Property="BackgroundColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedBackground'}" />
+                        </DataTrigger>
+                    </Frame.Triggers>
+                    
+                    <Grid>
+                        
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height="*"/>
+                            <RowDefinition Height="Auto"/>
+                        </Grid.RowDefinitions>
+                        
+                        <Image
+                            x:Name="_image"
+                            Source="{Binding Image}"
+                            Grid.Row="0"
+                            Aspect="AspectFit"
+                            BackgroundColor="Transparent"
+                            HeightRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Height'}"
+                            WidthRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Width'}">
+                            <Image.GestureRecognizers>
+                                <TapGestureRecognizer Tapped="DoTap"/>
+                            </Image.GestureRecognizers>
+                        </Image>
+                        
+                        <Label 
+                            x:Name="_label"
+                            Text="{Binding Text}"
+                            Grid.Row="1"
+                            FontSize="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontSize'}" 
+                            FontAttributes="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontAttributes'}"
+                            HorizontalTextAlignment="Center" 
+                            VerticalTextAlignment="Center" 
+                            BackgroundColor="Transparent"
+                            TextColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedForeground'}">
+                            <Label.GestureRecognizers>
+                                <TapGestureRecognizer Tapped="DoTap" />
+                            </Label.GestureRecognizers>
+                            <Label.Triggers>
+                                <DataTrigger TargetType="Label" Binding="{Binding Selected}" Value="True">
+                                    <Setter Property="TextColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedForeground'}" />
+                                </DataTrigger>
+                            </Label.Triggers>
+                        </Label> 
+                        
+                    </Grid>
+                </Frame>
+            </DataTemplate>
+            
+            <DataTemplate x:Key="HorizontalTemplate" x:DataType="mobile:MobileTabStripItem">
+                <Frame
+                    Grid.Column="{Binding Index}"
+                    HasShadow="False" 
+                    Margin="0" 
+                    Padding="5"
+                    BorderColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    CornerRadius="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='CornerRadius'}"
+                    IsClippedToBounds="True"
+                    VerticalOptions="Fill"
+                    HorizontalOptions="Fill">
+                    
+                    <Frame.GestureRecognizers>
+                        <TapGestureRecognizer Tapped="DoTap"/>
+                    </Frame.GestureRecognizers>
+                    
+                    <Frame.Triggers>
+                        <DataTrigger TargetType="Frame" Binding="{Binding Selected}" Value="True">
+                            <Setter Property="BackgroundColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedBackground'}" />
+                        </DataTrigger>
+                    </Frame.Triggers>
+                    
+                    <Grid>
+                        
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="Auto"/>
+                            <ColumnDefinition Width="*"/>
+                        </Grid.ColumnDefinitions>
+                        
+                        <Image
+                            x:Name="_image"
+                            Source="{Binding Image}"
+                            Grid.Column="0"
+                            Aspect="AspectFit"
+                            BackgroundColor="Transparent"
+                            HeightRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Height'}"
+                            WidthRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Width'}">
+                            <Image.GestureRecognizers>
+                                <TapGestureRecognizer Tapped="DoTap"/>
+                            </Image.GestureRecognizers>
+                        </Image>
+                        
+                        <Label 
+                            x:Name="_label"
+                            Text="{Binding Text}"
+                            Grid.Column="1"
+                            FontSize="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontSize'}" 
+                            FontAttributes="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontAttributes'}"
+                            HorizontalTextAlignment="Center" 
+                            VerticalTextAlignment="Center" 
+                            BackgroundColor="Transparent"
+                            TextColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedForeground'}">
+                            <Label.GestureRecognizers>
+                                <TapGestureRecognizer Tapped="DoTap" />
+                            </Label.GestureRecognizers>
+                            <Label.Triggers>
+                                <DataTrigger TargetType="Label" Binding="{Binding Selected}" Value="True">
+                                    <Setter Property="TextColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedForeground'}" />
+                                </DataTrigger>
+                            </Label.Triggers>
+                        </Label> 
+                        
+                    </Grid>
+                </Frame>
+            </DataTemplate>
+            
+            <DataTemplate x:Key="TextOnlyTemplate" x:DataType="mobile:MobileTabStripItem">
+                <Frame
+                    Grid.Column="{Binding Index}"
+                    HasShadow="False" 
+                    Margin="0" 
+                    Padding="5"
+                    BorderColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    CornerRadius="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='CornerRadius'}"
+                    IsClippedToBounds="True"
+                    VerticalOptions="Fill"
+                    HorizontalOptions="Fill">
+                    
+                    <Frame.GestureRecognizers>
+                        <TapGestureRecognizer Tapped="DoTap"/>
+                    </Frame.GestureRecognizers>
+                    
+                    <Frame.Triggers>
+                        <DataTrigger TargetType="Frame" Binding="{Binding Selected}" Value="True">
+                            <Setter Property="BackgroundColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedBackground'}" />
+                        </DataTrigger>
+                    </Frame.Triggers>
+                    
+                    <Label 
+                        x:Name="_label"
+                        Text="{Binding Text}"
+                        FontSize="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontSize'}" 
+                        FontAttributes="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontAttributes'}"
+                        HorizontalTextAlignment="Center" 
+                        VerticalTextAlignment="Center" 
+                        BackgroundColor="Transparent"
+                        TextColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedForeground'}">
+                        <Label.GestureRecognizers>
+                            <TapGestureRecognizer Tapped="DoTap" />
+                        </Label.GestureRecognizers>
+                        <Label.Triggers>
+                            <DataTrigger TargetType="Label" Binding="{Binding Selected}" Value="True">
+                                <Setter Property="TextColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedForeground'}" />
+                            </DataTrigger>
+                        </Label.Triggers>
+                    </Label> 
+
+                </Frame>
+            </DataTemplate>
+            
+            <DataTemplate x:Key="ImageOnlyTemplate" x:DataType="mobile:MobileTabStripItem">
+                <Frame
+                    Grid.Column="{Binding Index}"
+                    HasShadow="False" 
+                    Margin="0" 
+                    Padding="5"
+                    BorderColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
+                    CornerRadius="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='CornerRadius'}"
+                    IsClippedToBounds="True"
+                    VerticalOptions="Fill"
+                    HorizontalOptions="Fill">
+                    
+                    <Frame.GestureRecognizers>
+                        <TapGestureRecognizer Tapped="DoTap"/>
+                    </Frame.GestureRecognizers>
+                    
+                    <Frame.Triggers>
+                        <DataTrigger TargetType="Frame" Binding="{Binding Selected}" Value="True">
+                            <Setter Property="BackgroundColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedBackground'}" />
+                        </DataTrigger>
+                    </Frame.Triggers>
+                    
+                    <Image
+                        x:Name="_image"
+                        Source="{Binding Image}"
+                        Aspect="AspectFit"
+                        BackgroundColor="Transparent"
+                        HeightRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Height'}"
+                        WidthRequest="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ImageSize.Width'}">
+                        <Image.GestureRecognizers>
+                            <TapGestureRecognizer Tapped="DoTap"/>
+                        </Image.GestureRecognizers>
+                    </Image>
+                    
+                </Frame>
+            </DataTemplate>
+            
+            <mobile:MobileTabStripDataTemplateSelector 
+                x:Key="MobileTabStripDataTemplateSelector"
+                x:Name="_mobileTabStripDataTemplateSelector"
+                TextOnlyTemplate="{StaticResource TextOnlyTemplate}" 
+                ImageOnlyTemplate="{StaticResource ImageOnlyTemplate}"
+                VerticalTemplate="{StaticResource VerticalTemplate}"
+                HorizontalTemplate="{StaticResource HorizontalTemplate}"/>
+            
+        </ResourceDictionary>
+    </ContentView.Resources>
     <ContentView.Content>
     <ContentView.Content>
         
         
         <Frame
         <Frame
@@ -25,62 +255,19 @@
                 </OnPlatform>
                 </OnPlatform>
             </Frame.Padding>
             </Frame.Padding>
             
             
-            <Grid x:Name="_grid" ColumnSpacing="0">
-                
-                <BindableLayout.ItemTemplate>
+            <Grid 
+                x:Name="_grid" 
+                ColumnSpacing="0" 
+                BindableLayout.ItemTemplateSelector="{StaticResource MobileTabStripDataTemplateSelector}">
                 
                 
-                    <DataTemplate x:DataType="mobile:MobileTabStripItem">
-                        <Grid 
-                            Margin="0"
-                            Grid.Column="{Binding Index}"
-                        VerticalOptions="Fill"
-                        HorizontalOptions="Fill">
-                        
-                        <Grid.ColumnDefinitions>
-                            <ColumnDefinition Width="*"/>
-                        </Grid.ColumnDefinitions>
-                        
-                        <Grid.RowDefinitions>
-                            <RowDefinition Height="*"/>
-                        </Grid.RowDefinitions>
-                            
-                        <Frame
-                            HasShadow="False" 
-                            Margin="0" 
-                            Padding="0"
-                            BorderColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
-                            BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}" 
-                            CornerRadius="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='CornerRadius'}"
-                            IsClippedToBounds="True">
-
-                            <Label 
-                                Grid.Row="0" 
-                                x:Name="_label"
-                                Text="{Binding Text}" 
-                                FontSize="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontSize'}" 
-                                FontAttributes="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='FontAttributes'}"
-                                HorizontalTextAlignment="Center" 
-                                VerticalTextAlignment="Center" 
-                                BackgroundColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedBackground'}"
-                                TextColor="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='UnselectedForeground'}"
-                                Margin="0">
-                                <Label.GestureRecognizers>
-                                    <TapGestureRecognizer Tapped="DoTap" />
-                                </Label.GestureRecognizers>
-                                <Label.Triggers>
-                                    <DataTrigger TargetType="Label" Binding="{Binding Selected}" Value="True">
-                                        <Setter Property="TextColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedForeground'}" />
-                                        <Setter Property="BackgroundColor" Value="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='SelectedBackground'}" />
-                                    </DataTrigger>
-                                </Label.Triggers>
-                            </Label> 
-                        </Frame>
-                        
-                    </Grid>
-                        
-                </DataTemplate>
-                    
-            </BindableLayout.ItemTemplate>
+                <!-- <BindableLayout.ItemTemplateSelector> -->
+                <!--     <mobile:MobileTabStripDataTemplateSelector  -->
+                <!--         SelectedLayout="{Binding Source={RelativeSource AncestorType={x:Type mobile:MobileTabStrip}}, Path='ItemsLayout'}" -->
+                <!--         TextOnlyTemplate="{StaticResource TextOnlyTemplate}"  -->
+                <!--         ImageOnlyTemplate="{StaticResource ImageOnlyTemplate}" -->
+                <!--         VerticalTemplate="{StaticResource VerticalTemplate}" -->
+                <!--         HorizontalTemplate="{StaticResource HorizontalTemplate}"/> -->
+                <!-- </BindableLayout.ItemTemplateSelector> -->
                 
                 
             </Grid>
             </Grid>
             
             

+ 60 - 1
InABox.Mobile/InABox.Mobile.Shared/Components/MobileTabStrip/MobileTabStrip.xaml.cs

@@ -8,6 +8,36 @@ using Xamarin.Forms.Xaml;
 
 
 namespace InABox.Mobile
 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)]
     [XamlCompilation(XamlCompilationOptions.Compile)]
     public partial class MobileTabStrip
     public partial class MobileTabStrip
@@ -125,6 +155,35 @@ namespace InABox.Mobile
             set => SetValue(FontAttributesProperty, value);
             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 
         public MobileTabStripItem SelectedItem 
         {
         {
             get => Items.FirstOrDefault(x => x.Selected);
             get => Items.FirstOrDefault(x => x.Selected);
@@ -171,7 +230,7 @@ namespace InABox.Mobile
             Device.BeginInvokeOnMainThread(() =>
             Device.BeginInvokeOnMainThread(() =>
             {
             {
                 foreach (var item in Items)
                 foreach (var item in Items)
-                    item.Selected = item == (sender as Label)?.BindingContext;
+                    item.Selected = item == (sender as BindableObject)?.BindingContext;
                 OnPropertyChanged(nameof(Items));
                 OnPropertyChanged(nameof(Items));
                 SelectionChanged?.Invoke(this,EventArgs.Empty);
                 SelectionChanged?.Invoke(this,EventArgs.Empty);
             });
             });

+ 11 - 0
InABox.Mobile/InABox.Mobile.Shared/Components/MobileTabStrip/MobileTabStripItem.cs

@@ -18,6 +18,17 @@ namespace InABox.Mobile
             set => SetValue(TextProperty, value);
             set => SetValue(TextProperty, value);
         }
         }
         
         
+        private readonly BindableProperty ImageProperty = BindableProperty.Create(
+            nameof(Image),
+            typeof(ImageSource),
+            typeof(MobileTabStripItem));
+
+        public ImageSource Image
+        {
+            get => (ImageSource)GetValue(ImageProperty);
+            set => SetValue(ImageProperty, value);
+        }
+        
         private readonly BindableProperty SelectedProperty = BindableProperty.Create(
         private readonly BindableProperty SelectedProperty = BindableProperty.Create(
             nameof(Selected),
             nameof(Selected),
             typeof(bool),
             typeof(bool),

+ 1 - 1
InABox.Mobile/InABox.Mobile.Shared/Components/MobileTimeSelector/MobileTimeButton.xaml

@@ -7,7 +7,7 @@
              x:Class="InABox.Mobile.MobileTimeButton">
              x:Class="InABox.Mobile.MobileTimeButton">
 
 
     <ContentView.Resources>
     <ContentView.Resources>
-        <local:TimeSpanFormatter x:Key="TimeSpanFormatter" x:Name="_timespanFormatter"/>
+        <local:TimeSpanFormatter x:Key="TimeSpanFormatter" x:Name="_timespanFormatter" Prompt="Select Time"/>
     </ContentView.Resources>
     </ContentView.Resources>
     
     
     <ContentView.ControlTemplate>
     <ContentView.ControlTemplate>

+ 5 - 3
InABox.Mobile/InABox.Mobile.Shared/DataModels/CoreRepository.cs

@@ -298,13 +298,14 @@ namespace InABox.Mobile
         
         
         public Func<TItem, bool> SearchPredicate { get; set; }
         public Func<TItem, bool> SearchPredicate { get; set; }
 
 
-        public void Search(Func<TItem, bool> predicate)
+        public ICoreRepository Search(Func<TItem, bool> predicate)
         {
         {
             SearchPredicate = predicate;
             SearchPredicate = predicate;
             Search();
             Search();
+            return this;
         }
         }
 
 
-        public void Search()
+        public ICoreRepository Search()
         {
         {
             var curselected = _selectedItems.ToArray();
             var curselected = _selectedItems.ToArray();
             var items = _allitems == null
             var items = _allitems == null
@@ -321,9 +322,10 @@ namespace InABox.Mobile
             //_items.Clear();
             //_items.Clear();
             //_items.ReplaceRange(items);
             //_items.ReplaceRange(items);
             OnPropertyChanged(nameof(Items));
             OnPropertyChanged(nameof(Items));
+            return this;
         }
         }
  
  
-        void ICoreRepository.Search(Func<object,bool> method)
+        ICoreRepository ICoreRepository.Search(Func<object,bool> method)
             => Search((o) => method(o as TItem));
             => Search((o) => method(o as TItem));
 
 
 
 

+ 2 - 2
InABox.Mobile/InABox.Mobile.Shared/DataModels/ICoreRepository.cs

@@ -37,8 +37,8 @@ namespace InABox.Mobile
         object AddItem();
         object AddItem();
         void DeleteItem(object item);
         void DeleteItem(object item);
         IEnumerable Items { get; }
         IEnumerable Items { get; }
-        void Search();
-        void Search(Func<object,bool> predicate);
+        ICoreRepository Search();
+        ICoreRepository Search(Func<object,bool> predicate);
         
         
         void ToggleSelection(object item);
         void ToggleSelection(object item);
         void SelectItem(object item);
         void SelectItem(object item);

+ 7 - 5
InABox.Mobile/InABox.Mobile.Shared/InABox.Mobile.Shared.csproj

@@ -22,11 +22,13 @@
         </PackageReference>
         </PackageReference>
         <PackageReference Include="Serilog" Version="3.0.1" />
         <PackageReference Include="Serilog" Version="3.0.1" />
         <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
         <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
-        <PackageReference Include="Syncfusion.Licensing" Version="22.1.39" />
-        <PackageReference Include="Syncfusion.Xamarin.Pdf" Version="22.1.39" />
-        <PackageReference Include="Syncfusion.Xamarin.SfDataGrid" Version="22.1.39" />
-        <PackageReference Include="Syncfusion.Xamarin.SfPopupLayout" Version="22.1.39" />
-        <PackageReference Include="Syncfusion.Xamarin.SfPullToRefresh" Version="22.1.39" />
+        <PackageReference Include="Syncfusion.Licensing" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.Pdf" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.SfBusyIndicator" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.SfDataGrid" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.SfPicker" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.SfPopupLayout" Version="23.1.44" />
+        <PackageReference Include="Syncfusion.Xamarin.SfPullToRefresh" Version="23.1.44" />
         <PackageReference Include="Xamarin.Essentials" Version="1.8.0" />
         <PackageReference Include="Xamarin.Essentials" Version="1.8.0" />
         <PackageReference Include="Xamarin.Forms" Version="5.0.0.2612" />
         <PackageReference Include="Xamarin.Forms" Version="5.0.0.2612" />
         <PackageReference Include="XF.Material" Version="1.8.0" />
         <PackageReference Include="XF.Material" Version="1.8.0" />

+ 1 - 1
InABox.Mobile/InABox.Mobile.Shared/MobileUtils.cs

@@ -15,7 +15,7 @@ namespace InABox.Mobile
 
 
         public static void Init()
         public static void Init()
         {
         {
-            Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense(CoreUtils.SyncfusionLicense(SyncfusionVersion.v22_1));
+            Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense(CoreUtils.SyncfusionLicense(SyncfusionVersion.v23_1));
         }
         }
 
 
         public static String GetDeviceID()
         public static String GetDeviceID()