├── README.md
├── SampleApp
├── ExtendedShellTabBarSample
│ ├── AssemblyInfo.cs
│ ├── Models
│ │ └── Item.cs
│ ├── Views
│ │ ├── AboutPage.xaml.cs
│ │ ├── ItemDetailPage.xaml.cs
│ │ ├── NewItemPage.xaml.cs
│ │ ├── LoginPage.xaml.cs
│ │ ├── ItemDetailPage.xaml
│ │ ├── LoginPage.xaml
│ │ ├── ItemsPage.xaml.cs
│ │ ├── NewItemPage.xaml
│ │ ├── ItemsPage.xaml
│ │ └── AboutPage.xaml
│ ├── Services
│ │ ├── IDataStore.cs
│ │ └── MockDataStore.cs
│ ├── ExtendedShellTabBarSample.csproj
│ ├── ViewModels
│ │ ├── AboutViewModel.cs
│ │ ├── AppShellViewModel.cs
│ │ ├── LoginViewModel.cs
│ │ ├── ItemDetailViewModel.cs
│ │ ├── BaseViewModel.cs
│ │ ├── NewItemViewModel.cs
│ │ └── ItemsViewModel.cs
│ ├── AppShell.xaml.cs
│ ├── App.xaml.cs
│ ├── GettingStarted.txt
│ ├── App.xaml
│ └── AppShell.xaml
├── ExtendedShellTabBarSample.iOS
│ ├── Resources
│ │ ├── Default.png
│ │ ├── Default@2x.png
│ │ ├── icon_about.png
│ │ ├── icon_feed.png
│ │ ├── icon_about@2x.png
│ │ ├── icon_about@3x.png
│ │ ├── icon_feed@2x.png
│ │ ├── icon_feed@3x.png
│ │ ├── xamarin_logo.png
│ │ ├── Default-568h@2x.png
│ │ ├── xamarin_logo@2x.png
│ │ ├── xamarin_logo@3x.png
│ │ ├── Default-Portrait.png
│ │ ├── Default-Portrait@2x.png
│ │ └── LaunchScreen.storyboard
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Icon1024.png
│ │ │ ├── Icon120.png
│ │ │ ├── Icon152.png
│ │ │ ├── Icon167.png
│ │ │ ├── Icon180.png
│ │ │ ├── Icon20.png
│ │ │ ├── Icon29.png
│ │ │ ├── Icon40.png
│ │ │ ├── Icon58.png
│ │ │ ├── Icon60.png
│ │ │ ├── Icon76.png
│ │ │ ├── Icon80.png
│ │ │ ├── Icon87.png
│ │ │ └── Contents.json
│ │ └── centeredadd.imageset
│ │ │ ├── centeredadd.png
│ │ │ ├── centeredadd@2x.png
│ │ │ ├── centeredadd@3x.png
│ │ │ └── Contents.json
│ ├── Entitlements.plist
│ ├── Main.cs
│ ├── AppDelegate.cs
│ ├── Info.plist
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── ExtendedShellTabBarSample.iOS.csproj
├── ExtendedShellTabBarSample.Android
│ ├── Resources
│ │ ├── mipmap-hdpi
│ │ │ ├── icon.png
│ │ │ └── launcher_foreground.png
│ │ ├── mipmap-mdpi
│ │ │ ├── icon.png
│ │ │ └── launcher_foreground.png
│ │ ├── drawable
│ │ │ ├── icon_about.png
│ │ │ ├── icon_feed.png
│ │ │ └── xamarin_logo.png
│ │ ├── mipmap-xhdpi
│ │ │ ├── icon.png
│ │ │ └── launcher_foreground.png
│ │ ├── mipmap-xxhdpi
│ │ │ ├── icon.png
│ │ │ └── launcher_foreground.png
│ │ ├── mipmap-xxxhdpi
│ │ │ ├── icon.png
│ │ │ └── launcher_foreground.png
│ │ ├── drawable-hdpi
│ │ │ └── centeredadd.png
│ │ ├── drawable-ldpi
│ │ │ └── centeredadd.png
│ │ ├── drawable-mdpi
│ │ │ └── centeredadd.png
│ │ ├── drawable-xhdpi
│ │ │ └── centeredadd.png
│ │ ├── drawable-xxhdpi
│ │ │ └── centeredadd.png
│ │ ├── drawable-xxxhdpi
│ │ │ └── centeredadd.png
│ │ ├── mipmap-anydpi-v26
│ │ │ ├── icon.xml
│ │ │ └── icon_round.xml
│ │ ├── values
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ └── AboutResources.txt
│ ├── Properties
│ │ ├── AndroidManifest.xml
│ │ └── AssemblyInfo.cs
│ ├── Assets
│ │ └── AboutAssets.txt
│ ├── MainActivity.cs
│ └── ExtendedShellTabBarSample.Android.csproj
├── ExtendedShellTabBarSample.sln
└── .gitignore
├── Sources
├── ExtendedShellTabBar
│ ├── images
│ │ └── icon.png
│ ├── Renderers
│ │ ├── ExtendedShellRenderer.ios.cs
│ │ ├── ExtendedShellRenderer.android.cs
│ │ ├── ExtendedShellItemRenderer.ios.cs
│ │ └── ExtendedShellItemRenderer.android.cs
│ ├── Enums
│ │ └── CornerTransformType.shared.cs
│ ├── VisualElements
│ │ ├── ExtendedShellTabBar.shared.cs
│ │ └── ExtendedShellCenteredTab.shared.cs
│ ├── license
│ │ └── license.txt
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── Controls
│ │ └── ExtendedButton.android.cs
│ ├── Extensions
│ │ ├── ImageSourceExtensions.ios.cs
│ │ └── ImageSourceExtensions.android.cs
│ └── ExtendedShellTabBar.csproj
└── ExtendedShellTabBar.sln
├── LICENSE
└── .gitignore
/README.md:
--------------------------------------------------------------------------------
1 | # ExtendedShellTabBar
2 | Add a centered action button
3 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms.Xaml;
2 |
3 | [assembly: XamlCompilation(XamlCompilationOptions.Compile)]
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/Sources/ExtendedShellTabBar/images/icon.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/Default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/Default.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/Default@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/Default@2x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_about.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_feed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_feed.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_about@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_about@2x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_about@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_about@3x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_feed@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_feed@2x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_feed@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/icon_feed@3x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/xamarin_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/xamarin_logo.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/Default-568h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/Default-568h@2x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/xamarin_logo@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/xamarin_logo@2x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/xamarin_logo@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/xamarin_logo@3x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/Default-Portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/Default-Portrait.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-hdpi/icon.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-mdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-mdpi/icon.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/Default-Portrait@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Resources/Default-Portrait@2x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable/icon_about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable/icon_about.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable/icon_feed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable/icon_feed.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xhdpi/icon.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xxhdpi/icon.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xxxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xxxhdpi/icon.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable/xamarin_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable/xamarin_logo.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-hdpi/centeredadd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-hdpi/centeredadd.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-ldpi/centeredadd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-ldpi/centeredadd.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-mdpi/centeredadd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-mdpi/centeredadd.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-xhdpi/centeredadd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-xhdpi/centeredadd.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-xxhdpi/centeredadd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-xxhdpi/centeredadd.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-xxxhdpi/centeredadd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/drawable-xxxhdpi/centeredadd.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-hdpi/launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-hdpi/launcher_foreground.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-mdpi/launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-mdpi/launcher_foreground.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xhdpi/launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xhdpi/launcher_foreground.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xxhdpi/launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xxhdpi/launcher_foreground.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-xxxhdpi/launcher_foreground.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/centeredadd.imageset/centeredadd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/centeredadd.imageset/centeredadd.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/centeredadd.imageset/centeredadd@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/centeredadd.imageset/centeredadd@2x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/centeredadd.imageset/centeredadd@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/maui-plaroche/ExtendedShellTabBar/HEAD/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/centeredadd.imageset/centeredadd@3x.png
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Entitlements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Models/Item.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace ExtendedShellTabBarSample.Models
4 | {
5 | public class Item
6 | {
7 | public string Id { get; set; }
8 | public string Text { get; set; }
9 | public string Description { get; set; }
10 | }
11 | }
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-anydpi-v26/icon.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/mipmap-anydpi-v26/icon_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFFFFF
4 | #3F51B5
5 | #303F9F
6 | #FF4081
7 |
8 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Views/AboutPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.ComponentModel;
3 | using Xamarin.Forms;
4 | using Xamarin.Forms.Xaml;
5 |
6 | namespace ExtendedShellTabBarSample.Views
7 | {
8 | public partial class AboutPage : ContentPage
9 | {
10 | public AboutPage()
11 | {
12 | InitializeComponent();
13 | }
14 | }
15 | }
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Views/ItemDetailPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.ComponentModel;
2 | using Xamarin.Forms;
3 | using ExtendedShellTabBarSample.ViewModels;
4 |
5 | namespace ExtendedShellTabBarSample.Views
6 | {
7 | public partial class ItemDetailPage : ContentPage
8 | {
9 | public ItemDetailPage()
10 | {
11 | InitializeComponent();
12 | BindingContext = new ItemDetailViewModel();
13 | }
14 | }
15 | }
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Services/IDataStore.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Threading.Tasks;
4 |
5 | namespace ExtendedShellTabBarSample.Services
6 | {
7 | public interface IDataStore
8 | {
9 | Task AddItemAsync(T item);
10 | Task UpdateItemAsync(T item);
11 | Task DeleteItemAsync(string id);
12 | Task GetItemAsync(string id);
13 | Task> GetItemsAsync(bool forceRefresh = false);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/ExtendedShellTabBarSample.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0
5 | true
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/centeredadd.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "filename": "centeredadd@3x.png",
5 | "scale": "3x",
6 | "idiom": "universal"
7 | },
8 | {
9 | "filename": "centeredadd@2x.png",
10 | "scale": "2x",
11 | "idiom": "universal"
12 | },
13 | {
14 | "filename": "centeredadd.png",
15 | "scale": "1x",
16 | "idiom": "universal"
17 | }
18 | ],
19 | "info": {
20 | "version": 1,
21 | "author": "xcode"
22 | }
23 | }
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Properties/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/ViewModels/AboutViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Input;
3 | using Xamarin.Essentials;
4 | using Xamarin.Forms;
5 |
6 | namespace ExtendedShellTabBarSample.ViewModels
7 | {
8 | public class AboutViewModel : BaseViewModel
9 | {
10 | public AboutViewModel()
11 | {
12 | Title = "About";
13 | OpenWebCommand = new Command(async () => await Browser.OpenAsync("https://aka.ms/xamarin-quickstart"));
14 | }
15 |
16 | public ICommand OpenWebCommand { get; }
17 | }
18 | }
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/Renderers/ExtendedShellRenderer.ios.cs:
--------------------------------------------------------------------------------
1 | using ExtendedShellTabBar.Renderers.iOS;
2 | using Xamarin.Forms;
3 | using Xamarin.Forms.Platform.iOS;
4 |
5 | [assembly: ExportRenderer(typeof(Shell), typeof(ExtendedShellRenderer))]
6 | namespace ExtendedShellTabBar.Renderers.iOS
7 | {
8 | public class ExtendedShellRenderer : ShellRenderer
9 | {
10 | protected override IShellItemRenderer CreateShellItemRenderer(ShellItem item)
11 | {
12 | return new ExtendedShellItemRenderer(this) { ShellItem = item };
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Main.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | using Foundation;
6 | using UIKit;
7 |
8 | namespace ExtendedShellTabBarSample.iOS
9 | {
10 | public class Application
11 | {
12 | // This is the main entry point of the application.
13 | static void Main(string[] args)
14 | {
15 | // if you want to use a different Application Delegate class from "AppDelegate"
16 | // you can specify it here.
17 | UIApplication.Main(args, null, "AppDelegate");
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/ViewModels/AppShellViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Input;
3 | using Xamarin.Forms;
4 |
5 | namespace ExtendedShellTabBarSample.ViewModels
6 | {
7 | public class AppShellViewModel
8 | {
9 | public ICommand ClickCommand { get; set; }
10 |
11 | public AppShellViewModel()
12 | {
13 |
14 | ClickCommand = new Command(async () =>
15 | {
16 | await Application.Current.MainPage.DisplayAlert("Click !", "You click the centered button inside the TabBar", "OK");
17 | });
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Views/NewItemPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using Xamarin.Forms;
5 | using Xamarin.Forms.Xaml;
6 |
7 | using ExtendedShellTabBarSample.Models;
8 | using ExtendedShellTabBarSample.ViewModels;
9 |
10 | namespace ExtendedShellTabBarSample.Views
11 | {
12 | public partial class NewItemPage : ContentPage
13 | {
14 | public Item Item { get; set; }
15 |
16 | public NewItemPage()
17 | {
18 | InitializeComponent();
19 | BindingContext = new NewItemViewModel();
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Views/LoginPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using ExtendedShellTabBarSample.ViewModels;
7 | using Xamarin.Forms;
8 | using Xamarin.Forms.Xaml;
9 |
10 | namespace ExtendedShellTabBarSample.Views
11 | {
12 | [XamlCompilation(XamlCompilationOptions.Compile)]
13 | public partial class LoginPage : ContentPage
14 | {
15 | public LoginPage()
16 | {
17 | InitializeComponent();
18 | this.BindingContext = new LoginViewModel();
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/Enums/CornerTransformType.shared.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | namespace ExtendedShellTabBar.Enums
3 | {
4 | [Flags]
5 | public enum CornerTransformType
6 | {
7 | TopLeftRounded = 0x10,
8 | TopRightRounded = 0x20,
9 | BottomLeftRounded = 0x40,
10 | BottomRightRounded = 0x80,
11 |
12 | AllRounded = TopLeftRounded | TopRightRounded | BottomLeftRounded | BottomRightRounded,
13 | LeftRounded = TopLeftRounded | BottomLeftRounded,
14 | RightRounded = TopRightRounded | BottomRightRounded,
15 | TopRounded = TopLeftRounded | TopRightRounded,
16 | BottomRounded = BottomLeftRounded | BottomRightRounded,
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Views/ItemDetailPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/AppShell.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using ExtendedShellTabBarSample.ViewModels;
4 | using ExtendedShellTabBarSample.Views;
5 | using Xamarin.Forms;
6 |
7 | namespace ExtendedShellTabBarSample
8 | {
9 | public partial class AppShell : Xamarin.Forms.Shell
10 | {
11 | public AppShell()
12 | {
13 | InitializeComponent();
14 |
15 | this.BindingContext = new AppShellViewModel();
16 |
17 | Routing.RegisterRoute(nameof(ItemDetailPage), typeof(ItemDetailPage));
18 | Routing.RegisterRoute(nameof(NewItemPage), typeof(NewItemPage));
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/Renderers/ExtendedShellRenderer.android.cs:
--------------------------------------------------------------------------------
1 | using Android.Content;
2 | using ExtendedShellTabBar.Renderers;
3 | using Xamarin.Forms;
4 | using Xamarin.Forms.Platform.Android;
5 |
6 | [assembly: ExportRenderer(typeof(Shell), typeof(ExtendedShellRenderer))]
7 | namespace ExtendedShellTabBar.Renderers
8 | {
9 | public class ExtendedShellRenderer : ShellRenderer
10 | {
11 | public ExtendedShellRenderer(Context context) : base(context)
12 | {
13 | }
14 |
15 | protected override IShellItemRenderer CreateShellItemRenderer(ShellItem shellItem)
16 | {
17 | return new ExtendedShellItemRenderer(this);
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Assets/AboutAssets.txt:
--------------------------------------------------------------------------------
1 | Any raw assets you want to be deployed with your application can be placed in
2 | this directory (and child directories) and given a Build Action of "AndroidAsset".
3 |
4 | These files will be deployed with your package and will be accessible using Android's
5 | AssetManager, like this:
6 |
7 | public class ReadAsset : Activity
8 | {
9 | protected override void OnCreate (Bundle bundle)
10 | {
11 | base.OnCreate (bundle);
12 |
13 | InputStream input = Assets.Open ("my_asset.txt");
14 | }
15 | }
16 |
17 | Additionally, some Android functions will automatically load asset files:
18 |
19 | Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
20 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Xamarin.Forms;
3 | using Xamarin.Forms.Xaml;
4 | using ExtendedShellTabBarSample.Services;
5 | using ExtendedShellTabBarSample.Views;
6 |
7 | namespace ExtendedShellTabBarSample
8 | {
9 | public partial class App : Application
10 | {
11 |
12 | public App()
13 | {
14 | InitializeComponent();
15 |
16 | DependencyService.Register();
17 | MainPage = new AppShell();
18 | }
19 |
20 | protected override void OnStart()
21 | {
22 | }
23 |
24 | protected override void OnSleep()
25 | {
26 | }
27 |
28 | protected override void OnResume()
29 | {
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Views/LoginPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/ViewModels/LoginViewModel.cs:
--------------------------------------------------------------------------------
1 | using ExtendedShellTabBarSample.Views;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Text;
5 | using Xamarin.Forms;
6 |
7 | namespace ExtendedShellTabBarSample.ViewModels
8 | {
9 | public class LoginViewModel : BaseViewModel
10 | {
11 | public Command LoginCommand { get; }
12 |
13 | public LoginViewModel()
14 | {
15 | LoginCommand = new Command(OnLoginClicked);
16 | }
17 |
18 | private async void OnLoginClicked(object obj)
19 | {
20 | // Prefixing with `//` switches to a different navigation stack instead of pushing to the active one
21 | await Shell.Current.GoToAsync($"//{nameof(AboutPage)}");
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/VisualElements/ExtendedShellTabBar.shared.cs:
--------------------------------------------------------------------------------
1 | using Xamarin.Forms;
2 |
3 | namespace ExtendedShellTabBar.VisualElements
4 | {
5 | public class ExtendedShellTabBar : TabBar
6 | {
7 | public static readonly BindableProperty CenteredTabProperty = BindableProperty.Create(nameof(CenteredTab), typeof(ExtendedShellCenteredTab), typeof(ExtendedShellTabBar), default(ExtendedShellCenteredTab));
8 |
9 | public ExtendedShellCenteredTab CenteredTab
10 | {
11 | get { return (ExtendedShellCenteredTab)GetValue(CenteredTabProperty); }
12 | set { SetValue(CenteredTabProperty, value); }
13 | }
14 |
15 | protected override void OnBindingContextChanged()
16 | {
17 | base.OnBindingContextChanged();
18 | CenteredTab.BindingContext = this.BindingContext;
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Views/ItemsPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.ComponentModel;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 | using Xamarin.Forms;
8 | using Xamarin.Forms.Xaml;
9 |
10 | using ExtendedShellTabBarSample.Models;
11 | using ExtendedShellTabBarSample.Views;
12 | using ExtendedShellTabBarSample.ViewModels;
13 |
14 | namespace ExtendedShellTabBarSample.Views
15 | {
16 | public partial class ItemsPage : ContentPage
17 | {
18 | ItemsViewModel _viewModel;
19 |
20 | public ItemsPage()
21 | {
22 | InitializeComponent();
23 |
24 | BindingContext = _viewModel = new ItemsViewModel();
25 | }
26 |
27 | protected override void OnAppearing()
28 | {
29 | base.OnAppearing();
30 | _viewModel.OnAppearing();
31 | }
32 | }
33 | }
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
18 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/license/license.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2017 Paulin Laroche
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6 |
7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8 |
9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Laroche
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.809.10
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExtendedShellTabBar", "ExtendedShellTabBar\ExtendedShellTabBar.csproj", "{BE85EFB3-04C2-434B-BAFE-5AB38AC79F95}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {BE85EFB3-04C2-434B-BAFE-5AB38AC79F95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {BE85EFB3-04C2-434B-BAFE-5AB38AC79F95}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {BE85EFB3-04C2-434B-BAFE-5AB38AC79F95}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {BE85EFB3-04C2-434B-BAFE-5AB38AC79F95}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {D85EB692-EF66-4E9C-BA26-D1261099D0B7}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/AppDelegate.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | using Foundation;
6 | using UIKit;
7 |
8 | namespace ExtendedShellTabBarSample.iOS
9 | {
10 | // The UIApplicationDelegate for the application. This class is responsible for launching the
11 | // User Interface of the application, as well as listening (and optionally responding) to
12 | // application events from iOS.
13 | [Register("AppDelegate")]
14 | public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
15 | {
16 | //
17 | // This method is invoked when the application has loaded and is ready to run. In this
18 | // method you should instantiate the window, load the UI into it and then make the window
19 | // visible.
20 | //
21 | // You have 17 seconds to return from this method, or iOS will terminate your application.
22 | //
23 | public override bool FinishedLaunching(UIApplication app, NSDictionary options)
24 | {
25 | global::Xamarin.Forms.Forms.Init();
26 | LoadApplication(new App());
27 |
28 | return base.FinishedLaunching(app, options);
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 | using Android.App;
5 |
6 | // General Information about an assembly is controlled through the following
7 | // set of attributes. Change these attribute values to modify the information
8 | // associated with an assembly.
9 | [assembly: AssemblyTitle("ExtendedShellTabBarSample.Android")]
10 | [assembly: AssemblyDescription("")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("")]
13 | [assembly: AssemblyProduct("ExtendedShellTabBarSample.Android")]
14 | [assembly: AssemblyCopyright("Copyright © 2014")]
15 | [assembly: AssemblyTrademark("")]
16 | [assembly: AssemblyCulture("")]
17 | [assembly: ComVisible(false)]
18 |
19 | // Version information for an assembly consists of the following four values:
20 | //
21 | // Major Version
22 | // Minor Version
23 | // Build Number
24 | // Revision
25 | [assembly: AssemblyVersion("1.0.0.0")]
26 | [assembly: AssemblyFileVersion("1.0.0.0")]
27 |
28 | // Add some common permissions, these can be removed if not needed
29 | [assembly: UsesPermission(Android.Manifest.Permission.Internet)]
30 | [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]
31 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Views/NewItemPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/MainActivity.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | using Android.App;
4 | using Android.Content.PM;
5 | using Android.Runtime;
6 | using Android.OS;
7 |
8 | namespace ExtendedShellTabBarSample.Droid
9 | {
10 | [Activity(Label = "ExtendedShellTabBarSample", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
11 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
12 | {
13 | protected override void OnCreate(Bundle savedInstanceState)
14 | {
15 | base.OnCreate(savedInstanceState);
16 |
17 | Xamarin.Essentials.Platform.Init(this, savedInstanceState);
18 | global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
19 | LoadApplication(new App());
20 | }
21 | public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
22 | {
23 | Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
24 |
25 | base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/GettingStarted.txt:
--------------------------------------------------------------------------------
1 | Welcome to Xamarin.Forms! Here are some tips to get started building your app.
2 |
3 | Building Your App UI
4 | --------------------
5 |
6 | XAML Hot Reload quickly applies UI changes as you make them to your running app.
7 | This is the most productive way to preview and iteratively create your UI.
8 |
9 | Try it out:
10 |
11 | 1. Run the app by clicking the Start Debugging (play) button in the above toolbar.
12 | 2. Open \Views\AboutPage.xaml.
13 | Don't stop the app - keep it running while making changes.
14 | 3. Change something! Hint: change the Accent color on line 14 from "#96d1ff" to "Pink".
15 | 4. Watch the About screen update on the device or emulator, with the logo background now pink.
16 |
17 | Keep going and try more changes!
18 |
19 | QuickStart Guide
20 | ----------------
21 |
22 | Learn more of the fundamentals for building apps with Xamarin here: https://aka.ms/xamarin-quickstart
23 |
24 | Your App Shell
25 | --------------
26 |
27 | This template uses Shell, an app container that reduces the complexity of your apps by providing fundamental features including:
28 |
29 | - A single place to describe the app's visual hierarchy.
30 | - Common navigation such as a flyout menu and tabs.
31 | - A URI-based navigation scheme that permits navigation to any page in the application.
32 | - An integrated search handler.
33 |
34 | Open AppShell.xaml to begin exploring. To learn more about Shell visit: https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/shell/introduction
35 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("ExtendedShellTabBar")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("ExtendedShellTabBar")]
13 | [assembly: AssemblyCopyright("Copyright © 2017")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("50c7b8c9-e664-45af-b88e-0c9b8b9c1be1")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | UIDeviceFamily
6 |
7 | 1
8 | 2
9 |
10 | UISupportedInterfaceOrientations
11 |
12 | UIInterfaceOrientationPortrait
13 | UIInterfaceOrientationLandscapeLeft
14 | UIInterfaceOrientationLandscapeRight
15 |
16 | UISupportedInterfaceOrientations~ipad
17 |
18 | UIInterfaceOrientationPortrait
19 | UIInterfaceOrientationPortraitUpsideDown
20 | UIInterfaceOrientationLandscapeLeft
21 | UIInterfaceOrientationLandscapeRight
22 |
23 | MinimumOSVersion
24 | 8.0
25 | CFBundleDisplayName
26 | ExtendedShellTabBarSample
27 | CFBundleIdentifier
28 | com.mobile-concept.extendedshelltabbar.ExtendedShellTabBarSample
29 | CFBundleVersion
30 | 1.0
31 | UILaunchStoryboardName
32 | LaunchScreen
33 | CFBundleName
34 | ExtendedShellTabBarSample
35 | XSAppIconAssets
36 | Assets.xcassets/AppIcon.appiconset
37 |
38 |
39 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("ExtendedShellTabBarSample.iOS")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("ExtendedShellTabBarSample.iOS")]
13 | [assembly: AssemblyCopyright("Copyright © 2014")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/ViewModels/ItemDetailViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.Threading.Tasks;
4 | using ExtendedShellTabBarSample.Models;
5 | using Xamarin.Forms;
6 |
7 | namespace ExtendedShellTabBarSample.ViewModels
8 | {
9 | [QueryProperty(nameof(ItemId), nameof(ItemId))]
10 | public class ItemDetailViewModel : BaseViewModel
11 | {
12 | private string itemId;
13 | private string text;
14 | private string description;
15 | public string Id { get; set; }
16 |
17 | public string Text
18 | {
19 | get => text;
20 | set => SetProperty(ref text, value);
21 | }
22 |
23 | public string Description
24 | {
25 | get => description;
26 | set => SetProperty(ref description, value);
27 | }
28 |
29 | public string ItemId
30 | {
31 | get
32 | {
33 | return itemId;
34 | }
35 | set
36 | {
37 | itemId = value;
38 | LoadItemId(value);
39 | }
40 | }
41 |
42 | public async void LoadItemId(string itemId)
43 | {
44 | try
45 | {
46 | var item = await DataStore.GetItemAsync(itemId);
47 | Id = item.Id;
48 | Text = item.Text;
49 | Description = item.Description;
50 | }
51 | catch (Exception)
52 | {
53 | Debug.WriteLine("Failed to Load Item");
54 | }
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/App.xaml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
10 | #2196F3
11 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/Controls/ExtendedButton.android.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Drawing;
3 | using Android.Content;
4 | using Android.Graphics;
5 | using Android.Widget;
6 | using static Android.Graphics.Paint;
7 | using static Android.Graphics.PorterDuff;
8 | using Color = Android.Graphics.Color;
9 |
10 | namespace ExtendedShellTabBar.Controls.Droid
11 | {
12 | public class ExtendedButton : Button
13 | {
14 | public Android.Graphics.Color BorderColor { get; set; }
15 | public int BorderThickness { get; set; }
16 | public float CornerRadius { get; set; }
17 |
18 | public ExtendedButton(Context context) : base(context)
19 | {
20 | }
21 |
22 | protected override void OnDraw(Canvas canvas)
23 | {
24 |
25 | if (CornerRadius > 0)
26 | {
27 | Rect rc = new Rect();
28 | GetDrawingRect(rc);
29 |
30 | Rect interior = rc;
31 | interior.Inset((int)BorderThickness, (int)BorderThickness);
32 |
33 | Paint p = new Paint()
34 | {
35 | Color = Color.Transparent,
36 | AntiAlias = true,
37 | };
38 |
39 | canvas.DrawRoundRect(new RectF(interior), (float)CornerRadius, (float)CornerRadius, p);
40 |
41 | p.Color = BorderColor;
42 | p.StrokeWidth = (float)BorderThickness;
43 | p.SetStyle(Style.Stroke);
44 |
45 | canvas.DrawRoundRect(new RectF(rc), (float)CornerRadius, (float)CornerRadius, p);
46 |
47 | canvas.ClipRect(interior);
48 | }
49 | else
50 | {
51 | base.OnDraw(canvas);
52 | }
53 | }
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/Extensions/ImageSourceExtensions.ios.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading;
3 | using System.Threading.Tasks;
4 | using UIKit;
5 | using Xamarin.Forms;
6 | using Xamarin.Forms.Internals;
7 | using Xamarin.Forms.Platform.iOS;
8 |
9 | namespace ExtendedShellTabBar.Extensions.iOS
10 | {
11 | public static class ImageSourceExtensions
12 | {
13 | public static IImageSourceHandler GetHandler(this ImageSource source)
14 | {
15 | //Image source handler to return
16 | IImageSourceHandler returnValue = null;
17 | //check the specific source type and return the correct image source handler
18 | if (source is UriImageSource)
19 | {
20 | returnValue = new ImageLoaderSourceHandler();
21 | }
22 | else if (source is FileImageSource)
23 | {
24 | returnValue = new FileImageSourceHandler();
25 | }
26 | else if (source is StreamImageSource)
27 | {
28 | returnValue = new StreamImagesourceHandler();
29 | }
30 | return returnValue;
31 | }
32 |
33 | public static async Task GetNativeImageAsync(this ImageSource source, CancellationToken cancellationToken = default(CancellationToken))
34 | {
35 | if (source == null || source.IsEmpty)
36 | return null;
37 |
38 | var handler = source.GetHandler();
39 | if (handler == null)
40 | return null;
41 |
42 | try
43 | {
44 | float scale = (float)UIScreen.MainScreen.Scale;
45 | return await handler.LoadImageAsync(source, scale: scale, cancelationToken: cancellationToken);
46 | }
47 | catch (OperationCanceledException)
48 | {
49 | Log.Warning("Image loading", "Image load cancelled");
50 | }
51 | catch (Exception ex)
52 | {
53 | Log.Warning("Image loading", $"Image load failed: {ex}");
54 | }
55 |
56 | return null;
57 | }
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/ViewModels/BaseViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Runtime.CompilerServices;
5 |
6 | using Xamarin.Forms;
7 |
8 | using ExtendedShellTabBarSample.Models;
9 | using ExtendedShellTabBarSample.Services;
10 |
11 | namespace ExtendedShellTabBarSample.ViewModels
12 | {
13 | public class BaseViewModel : INotifyPropertyChanged
14 | {
15 | public IDataStore- DataStore => DependencyService.Get>();
16 |
17 | bool isBusy = false;
18 | public bool IsBusy
19 | {
20 | get { return isBusy; }
21 | set { SetProperty(ref isBusy, value); }
22 | }
23 |
24 | string title = string.Empty;
25 | public string Title
26 | {
27 | get { return title; }
28 | set { SetProperty(ref title, value); }
29 | }
30 |
31 | protected bool SetProperty(ref T backingStore, T value,
32 | [CallerMemberName] string propertyName = "",
33 | Action onChanged = null)
34 | {
35 | if (EqualityComparer.Default.Equals(backingStore, value))
36 | return false;
37 |
38 | backingStore = value;
39 | onChanged?.Invoke();
40 | OnPropertyChanged(propertyName);
41 | return true;
42 | }
43 |
44 | #region INotifyPropertyChanged
45 | public event PropertyChangedEventHandler PropertyChanged;
46 | protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
47 | {
48 | var changed = PropertyChanged;
49 | if (changed == null)
50 | return;
51 |
52 | changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
53 | }
54 | #endregion
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/Resources/AboutResources.txt:
--------------------------------------------------------------------------------
1 | Images, layout descriptions, binary blobs and string dictionaries can be included
2 | in your application as resource files. Various Android APIs are designed to
3 | operate on the resource IDs instead of dealing with images, strings or binary blobs
4 | directly.
5 |
6 | For example, a sample Android app that contains a user interface layout (main.xml),
7 | an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
8 | would keep its resources in the "Resources" directory of the application:
9 |
10 | Resources/
11 | drawable-hdpi/
12 | icon.png
13 |
14 | drawable-ldpi/
15 | icon.png
16 |
17 | drawable-mdpi/
18 | icon.png
19 |
20 | layout/
21 | main.xml
22 |
23 | values/
24 | strings.xml
25 |
26 | In order to get the build system to recognize Android resources, set the build action to
27 | "AndroidResource". The native Android APIs do not operate directly with filenames, but
28 | instead operate on resource IDs. When you compile an Android application that uses resources,
29 | the build system will package the resources for distribution and generate a class called
30 | "Resource" that contains the tokens for each one of the resources included. For example,
31 | for the above Resources layout, this is what the Resource class would expose:
32 |
33 | public class Resource {
34 | public class drawable {
35 | public const int icon = 0x123;
36 | }
37 |
38 | public class layout {
39 | public const int main = 0x456;
40 | }
41 |
42 | public class strings {
43 | public const int first_string = 0xabc;
44 | public const int second_string = 0xbcd;
45 | }
46 | }
47 |
48 | You would then use R.drawable.icon to reference the drawable/icon.png file, or Resource.layout.main
49 | to reference the layout/main.xml file, or Resource.strings.first_string to reference the first
50 | string in the dictionary file values/strings.xml.
51 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/ViewModels/NewItemViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 | using System.Windows.Input;
5 | using ExtendedShellTabBarSample.Models;
6 | using Xamarin.Forms;
7 |
8 | namespace ExtendedShellTabBarSample.ViewModels
9 | {
10 | public class NewItemViewModel : BaseViewModel
11 | {
12 | private string text;
13 | private string description;
14 |
15 | public NewItemViewModel()
16 | {
17 | SaveCommand = new Command(OnSave, ValidateSave);
18 | CancelCommand = new Command(OnCancel);
19 | this.PropertyChanged +=
20 | (_, __) => SaveCommand.ChangeCanExecute();
21 | }
22 |
23 | private bool ValidateSave()
24 | {
25 | return !String.IsNullOrWhiteSpace(text)
26 | && !String.IsNullOrWhiteSpace(description);
27 | }
28 |
29 | public string Text
30 | {
31 | get => text;
32 | set => SetProperty(ref text, value);
33 | }
34 |
35 | public string Description
36 | {
37 | get => description;
38 | set => SetProperty(ref description, value);
39 | }
40 |
41 | public Command SaveCommand { get; }
42 | public Command CancelCommand { get; }
43 |
44 | private async void OnCancel()
45 | {
46 | // This will pop the current page off the navigation stack
47 | await Shell.Current.GoToAsync("..");
48 | }
49 |
50 | private async void OnSave()
51 | {
52 | Item newItem = new Item()
53 | {
54 | Id = Guid.NewGuid().ToString(),
55 | Text = Text,
56 | Description = Description
57 | };
58 |
59 | await DataStore.AddItemAsync(newItem);
60 |
61 | // This will pop the current page off the navigation stack
62 | await Shell.Current.GoToAsync("..");
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/Renderers/ExtendedShellItemRenderer.ios.cs:
--------------------------------------------------------------------------------
1 | using CoreGraphics;
2 | using ExtendedShellTabBar.Extensions.iOS;
3 | using UIKit;
4 | using Xamarin.Forms.Platform.iOS;
5 |
6 | namespace ExtendedShellTabBar.Renderers.iOS
7 | {
8 | /*
9 | * ShellItemRenderer is UITabBarController
10 | * */
11 | public class ExtendedShellItemRenderer : ShellItemRenderer
12 | {
13 | IShellContext _context;
14 |
15 | public ExtendedShellItemRenderer(IShellContext context) : base(context)
16 | {
17 | _context = context;
18 | }
19 |
20 | public override async void ViewWillLayoutSubviews()
21 | {
22 | base.ViewWillLayoutSubviews();
23 |
24 | if (ShellItem != null && ShellItem is VisualElements.ExtendedShellTabBar)
25 | {
26 | var tabbar = (VisualElements.ExtendedShellTabBar)ShellItem;
27 |
28 | var centeredTab = tabbar.CenteredTab;
29 |
30 | if (centeredTab != null && centeredTab.Icon != null)
31 | {
32 | var x = (TabBar.Frame.Width - centeredTab.Width) / 2;
33 | var y = TabBar.Frame.Y - centeredTab.Height / 2;
34 | var imgView = new UIImageView(new CGRect(x, y, centeredTab.Width, centeredTab.Height));
35 |
36 | var image = await centeredTab.Icon.GetNativeImageAsync();
37 | imgView.Image = image;
38 | imgView.ClipsToBounds = true;
39 | imgView.Layer.CornerRadius = centeredTab.CornerRadius;
40 | imgView.Layer.BorderColor = centeredTab.BorderColor.ToCGColor();
41 | imgView.Layer.BorderWidth = centeredTab.BorderThickness;
42 | imgView.UserInteractionEnabled = true;
43 |
44 | if (centeredTab.Command != null)
45 | {
46 | imgView.AddGestureRecognizer(new UITapGestureRecognizer(TapGesture));
47 | }
48 |
49 | Add(imgView);
50 | }
51 | }
52 | }
53 |
54 | private void TapGesture()
55 | {
56 | var tabbar = (VisualElements.ExtendedShellTabBar)ShellItem;
57 | var centeredTab = tabbar.CenteredTab;
58 | centeredTab?.Command?.Execute(centeredTab);
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Services/MockDataStore.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using ExtendedShellTabBarSample.Models;
6 |
7 | namespace ExtendedShellTabBarSample.Services
8 | {
9 | public class MockDataStore : IDataStore
-
10 | {
11 | readonly List
- items;
12 |
13 | public MockDataStore()
14 | {
15 | items = new List
- ()
16 | {
17 | new Item { Id = Guid.NewGuid().ToString(), Text = "First item", Description="This is an item description." },
18 | new Item { Id = Guid.NewGuid().ToString(), Text = "Second item", Description="This is an item description." },
19 | new Item { Id = Guid.NewGuid().ToString(), Text = "Third item", Description="This is an item description." },
20 | new Item { Id = Guid.NewGuid().ToString(), Text = "Fourth item", Description="This is an item description." },
21 | new Item { Id = Guid.NewGuid().ToString(), Text = "Fifth item", Description="This is an item description." },
22 | new Item { Id = Guid.NewGuid().ToString(), Text = "Sixth item", Description="This is an item description." }
23 | };
24 | }
25 |
26 | public async Task AddItemAsync(Item item)
27 | {
28 | items.Add(item);
29 |
30 | return await Task.FromResult(true);
31 | }
32 |
33 | public async Task UpdateItemAsync(Item item)
34 | {
35 | var oldItem = items.Where((Item arg) => arg.Id == item.Id).FirstOrDefault();
36 | items.Remove(oldItem);
37 | items.Add(item);
38 |
39 | return await Task.FromResult(true);
40 | }
41 |
42 | public async Task DeleteItemAsync(string id)
43 | {
44 | var oldItem = items.Where((Item arg) => arg.Id == id).FirstOrDefault();
45 | items.Remove(oldItem);
46 |
47 | return await Task.FromResult(true);
48 | }
49 |
50 | public async Task
- GetItemAsync(string id)
51 | {
52 | return await Task.FromResult(items.FirstOrDefault(s => s.Id == id));
53 | }
54 |
55 | public async Task> GetItemsAsync(bool forceRefresh = false)
56 | {
57 | return await Task.FromResult(items);
58 | }
59 | }
60 | }
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Views/ItemsPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
17 |
18 |
21 |
22 |
23 |
24 |
28 |
32 |
33 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/ViewModels/ItemsViewModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.ObjectModel;
3 | using System.Diagnostics;
4 | using System.Threading.Tasks;
5 |
6 | using Xamarin.Forms;
7 |
8 | using ExtendedShellTabBarSample.Models;
9 | using ExtendedShellTabBarSample.Views;
10 |
11 | namespace ExtendedShellTabBarSample.ViewModels
12 | {
13 | public class ItemsViewModel : BaseViewModel
14 | {
15 | private Item _selectedItem;
16 |
17 | public ObservableCollection
- Items { get; }
18 | public Command LoadItemsCommand { get; }
19 | public Command AddItemCommand { get; }
20 | public Command
- ItemTapped { get; }
21 |
22 | public ItemsViewModel()
23 | {
24 | Title = "Browse";
25 | Items = new ObservableCollection
- ();
26 | LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand());
27 |
28 | ItemTapped = new Command
- (OnItemSelected);
29 |
30 | AddItemCommand = new Command(OnAddItem);
31 | }
32 |
33 | async Task ExecuteLoadItemsCommand()
34 | {
35 | IsBusy = true;
36 |
37 | try
38 | {
39 | Items.Clear();
40 | var items = await DataStore.GetItemsAsync(true);
41 | foreach (var item in items)
42 | {
43 | Items.Add(item);
44 | }
45 | }
46 | catch (Exception ex)
47 | {
48 | Debug.WriteLine(ex);
49 | }
50 | finally
51 | {
52 | IsBusy = false;
53 | }
54 | }
55 |
56 | public void OnAppearing()
57 | {
58 | IsBusy = true;
59 | SelectedItem = null;
60 | }
61 |
62 | public Item SelectedItem
63 | {
64 | get => _selectedItem;
65 | set
66 | {
67 | SetProperty(ref _selectedItem, value);
68 | OnItemSelected(value);
69 | }
70 | }
71 |
72 | private async void OnAddItem(object obj)
73 | {
74 | await Shell.Current.GoToAsync(nameof(NewItemPage));
75 | }
76 |
77 | async void OnItemSelected(Item item)
78 | {
79 | if (item == null)
80 | return;
81 |
82 | // This will push the ItemDetailPage onto the navigation stack
83 | await Shell.Current.GoToAsync($"{nameof(ItemDetailPage)}?{nameof(ItemDetailViewModel.ItemId)}={item.Id}");
84 | }
85 | }
86 | }
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/Views/AboutPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | #96d1ff
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
44 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Resources/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images": [
3 | {
4 | "scale": "2x",
5 | "size": "20x20",
6 | "idiom": "iphone",
7 | "filename": "Icon40.png"
8 | },
9 | {
10 | "scale": "3x",
11 | "size": "20x20",
12 | "idiom": "iphone",
13 | "filename": "Icon60.png"
14 | },
15 | {
16 | "scale": "2x",
17 | "size": "29x29",
18 | "idiom": "iphone",
19 | "filename": "Icon58.png"
20 | },
21 | {
22 | "scale": "3x",
23 | "size": "29x29",
24 | "idiom": "iphone",
25 | "filename": "Icon87.png"
26 | },
27 | {
28 | "scale": "2x",
29 | "size": "40x40",
30 | "idiom": "iphone",
31 | "filename": "Icon80.png"
32 | },
33 | {
34 | "scale": "3x",
35 | "size": "40x40",
36 | "idiom": "iphone",
37 | "filename": "Icon120.png"
38 | },
39 | {
40 | "scale": "2x",
41 | "size": "60x60",
42 | "idiom": "iphone",
43 | "filename": "Icon120.png"
44 | },
45 | {
46 | "scale": "3x",
47 | "size": "60x60",
48 | "idiom": "iphone",
49 | "filename": "Icon180.png"
50 | },
51 | {
52 | "scale": "1x",
53 | "size": "20x20",
54 | "idiom": "ipad",
55 | "filename": "Icon20.png"
56 | },
57 | {
58 | "scale": "2x",
59 | "size": "20x20",
60 | "idiom": "ipad",
61 | "filename": "Icon40.png"
62 | },
63 | {
64 | "scale": "1x",
65 | "size": "29x29",
66 | "idiom": "ipad",
67 | "filename": "Icon29.png"
68 | },
69 | {
70 | "scale": "2x",
71 | "size": "29x29",
72 | "idiom": "ipad",
73 | "filename": "Icon58.png"
74 | },
75 | {
76 | "scale": "1x",
77 | "size": "40x40",
78 | "idiom": "ipad",
79 | "filename": "Icon40.png"
80 | },
81 | {
82 | "scale": "2x",
83 | "size": "40x40",
84 | "idiom": "ipad",
85 | "filename": "Icon80.png"
86 | },
87 | {
88 | "scale": "1x",
89 | "size": "76x76",
90 | "idiom": "ipad",
91 | "filename": "Icon76.png"
92 | },
93 | {
94 | "scale": "2x",
95 | "size": "76x76",
96 | "idiom": "ipad",
97 | "filename": "Icon152.png"
98 | },
99 | {
100 | "scale": "2x",
101 | "size": "83.5x83.5",
102 | "idiom": "ipad",
103 | "filename": "Icon167.png"
104 | },
105 | {
106 | "scale": "1x",
107 | "size": "1024x1024",
108 | "idiom": "ios-marketing",
109 | "filename": "Icon1024.png"
110 | }
111 | ],
112 | "properties": {},
113 | "info": {
114 | "version": 1,
115 | "author": "xcode"
116 | }
117 | }
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample/AppShell.xaml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
16 |
17 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
46 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/ExtendedShellTabBar.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | netstandard2.0;xamarinios10;monoandroid10.0;
4 | ExtendedShellTabBar
5 | ExtendedShellTabBar
6 | $(AssemblyName) ($(TargetFramework))
7 | en
8 | $(DefineConstants);
9 | false
10 | portable
11 | Debug;Release
12 | latestmajor
13 | ExtendedShellTabBar
14 | https://github.com/xamarin-plaroche/ExtendedShellTabBar
15 | Paulin Laroche
16 | license.txt
17 | images\icon.png
18 | 1.0.3
19 |
20 |
21 | full
22 | true
23 | false
24 |
25 |
26 | true
27 | full
28 | true
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/VisualElements/ExtendedShellCenteredTab.shared.cs:
--------------------------------------------------------------------------------
1 | using System.Windows.Input;
2 | using ExtendedShellTabBar.Enums;
3 | using Xamarin.Forms;
4 |
5 | namespace ExtendedShellTabBar.VisualElements
6 | {
7 | public class ExtendedShellCenteredTab : BindableObject
8 | {
9 | public static readonly BindableProperty CommandProperty = BindableProperty.Create(nameof(Command), typeof(ICommand), typeof(ExtendedShellCenteredTab), default(ICommand));
10 |
11 | public ICommand Command
12 | {
13 | get { return (ICommand)GetValue(CommandProperty); }
14 | set { SetValue(CommandProperty, value); }
15 | }
16 |
17 | public static readonly BindableProperty IconProperty = BindableProperty.Create(nameof(Icon), typeof(ImageSource), typeof(ExtendedShellCenteredTab), null);
18 |
19 | public ImageSource Icon
20 | {
21 | get { return (ImageSource)GetValue(IconProperty); }
22 | set { SetValue(IconProperty, value); }
23 | }
24 |
25 | public static readonly BindableProperty CornerRadiusProperty = BindableProperty.Create(nameof(CornerRadius), typeof(int), typeof(ExtendedShellCenteredTab), 0);
26 |
27 | public int CornerRadius
28 | {
29 | get { return (int)GetValue(CornerRadiusProperty); }
30 | set { SetValue(CornerRadiusProperty, value); }
31 | }
32 |
33 | public static readonly BindableProperty BorderThicknessProperty = BindableProperty.Create(nameof(BorderThickness), typeof(int), typeof(ExtendedShellCenteredTab), 0);
34 |
35 | public int BorderThickness
36 | {
37 | get { return (int)GetValue(BorderThicknessProperty); }
38 | set { SetValue(BorderThicknessProperty, value); }
39 | }
40 |
41 | public static readonly BindableProperty BorderColorProperty = BindableProperty.Create(nameof(BorderColor), typeof(Color), typeof(ExtendedShellCenteredTab), Color.Transparent);
42 |
43 | public Color BorderColor
44 | {
45 | get { return (Color)GetValue(BorderColorProperty); }
46 | set { SetValue(BorderColorProperty, value); }
47 | }
48 |
49 | public static readonly BindableProperty CornersTransformationProperty = BindableProperty.Create(nameof(CornersTransformation), typeof(CornerTransformType), typeof(ExtendedShellCenteredTab), CornerTransformType.AllRounded);
50 |
51 | public CornerTransformType CornersTransformation
52 | {
53 | get => (CornerTransformType)GetValue(CornersTransformationProperty);
54 | set => SetValue(CornersTransformationProperty, value);
55 | }
56 |
57 | public static readonly BindableProperty WidthProperty = BindableProperty.Create(nameof(Width), typeof(int), typeof(ExtendedShellCenteredTab), 0);
58 |
59 | public int Width
60 | {
61 | get { return (int)GetValue(WidthProperty); }
62 | set { SetValue(WidthProperty, value); }
63 | }
64 |
65 | public static readonly BindableProperty HeightProperty = BindableProperty.Create(nameof(Height), typeof(int), typeof(ExtendedShellCenteredTab), 0);
66 |
67 | public int Height
68 | {
69 | get { return (int)GetValue(HeightProperty); }
70 | set { SetValue(HeightProperty, value); }
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/Extensions/ImageSourceExtensions.android.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading;
3 | using System.Threading.Tasks;
4 | using Android.Content;
5 | using Android.Graphics;
6 | using Xamarin.Forms;
7 | using Xamarin.Forms.Internals;
8 | using Xamarin.Forms.Platform.Android;
9 |
10 | namespace ExtendedShellTabBar.Extensions.Droid
11 | {
12 | public static class ImageSourceExtensions
13 | {
14 | public static IImageSourceHandler GetHandler(this ImageSource source)
15 | {
16 | //Image source handler to return
17 | IImageSourceHandler returnValue = null;
18 | //check the specific source type and return the correct image source handler
19 | if (source is UriImageSource)
20 | {
21 | returnValue = new ImageLoaderSourceHandler();
22 | }
23 | else if (source is FileImageSource)
24 | {
25 | returnValue = new FileImageSourceHandler();
26 | }
27 | else if (source is StreamImageSource)
28 | {
29 | returnValue = new StreamImagesourceHandler();
30 | }
31 | return returnValue;
32 | }
33 |
34 | public static async Task GetNativeImageAsync(
35 | this ImageSource source,
36 | Context context,
37 | int width,
38 | int height,
39 | CancellationToken cancellationToken = default(CancellationToken))
40 | {
41 | if (source == null || source.IsEmpty)
42 | return null;
43 |
44 | var handler = source.GetHandler();
45 | if (handler == null)
46 | return null;
47 |
48 | try
49 | {
50 | if (handler != null)
51 | {
52 | var image = await handler.LoadImageAsync(source, context);
53 | if (image == null && source is FileImageSource fileImageSource)
54 | {
55 | // Maybe is xml
56 | int drawableId = context.Resources.GetIdentifier(fileImageSource.File, "drawable", context.PackageName);
57 | using var drawable = context.Resources.GetDrawable(drawableId, null);
58 |
59 | var bitmap = Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888);
60 | using var canvas = new Canvas(bitmap);
61 | drawable.SetBounds(0, 0, canvas.Width, canvas.Height);
62 | drawable.Draw(canvas);
63 |
64 | return bitmap;
65 | }
66 |
67 | return image;
68 | }
69 | }
70 | catch (OperationCanceledException)
71 | {
72 | Log.Warning("Image loading", "Image load cancelled");
73 | }
74 | catch (Exception ex)
75 | {
76 | Log.Warning("Image loading", $"Image load failed: {ex}");
77 | }
78 |
79 | return null;
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/Sources/ExtendedShellTabBar/Renderers/ExtendedShellItemRenderer.android.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Android.OS;
3 | using Android.Views;
4 | using Android.Widget;
5 | using AndroidX.Core.Graphics.Drawable;
6 | using ExtendedShellTabBar.Controls.Droid;
7 | using ExtendedShellTabBar.Extensions.Droid;
8 | using Google.Android.Material.BottomNavigation;
9 | using Xamarin.Forms.Platform.Android;
10 | using View = Android.Views.View;
11 |
12 | namespace ExtendedShellTabBar.Renderers
13 | {
14 | public class ExtendedShellItemRenderer : ShellItemRenderer
15 | {
16 |
17 | FrameLayout _bottomView;
18 | ExtendedButton button;
19 |
20 | public ExtendedShellItemRenderer(IShellContext shellContext) : base(shellContext)
21 | {
22 | }
23 |
24 | public override void OnViewCreated(View view, Bundle savedInstanceState)
25 | {
26 | base.OnViewCreated(view, savedInstanceState);
27 | _bottomView = view.FindViewById(Resource.Id.bottomtab_tabbar);
28 |
29 | if (ShellItem != null && ShellItem is VisualElements.ExtendedShellTabBar)
30 | {
31 | var tabbar = (VisualElements.ExtendedShellTabBar)ShellItem;
32 | var centeredTab = tabbar.CenteredTab;
33 |
34 | if (centeredTab != null && centeredTab.Icon != null)
35 | {
36 | SetupLargeTab();
37 | }
38 | }
39 | }
40 |
41 | private async void SetupLargeTab()
42 | {
43 | if (ShellItem != null)
44 | {
45 | var centeredLayout = new FrameLayout(Context);
46 |
47 | var tabbar = (VisualElements.ExtendedShellTabBar)ShellItem;
48 | var centeredTab = tabbar.CenteredTab;
49 |
50 | var bitmap = await centeredTab.Icon.GetNativeImageAsync(this.Context, centeredTab.Width, centeredTab.Height);
51 |
52 | button = new ExtendedButton(Context)
53 | {
54 | CornerRadius = centeredTab.CornerRadius * Resources.DisplayMetrics.Density,
55 | BorderColor = centeredTab.BorderColor.ToAndroid(),
56 | BorderThickness = centeredTab.BorderThickness
57 | };
58 |
59 | var lp = new LinearLayout.LayoutParams((int)(centeredTab.Width * Resources.DisplayMetrics.Density), (int)(centeredTab.Height * Resources.DisplayMetrics.Density));
60 | button.LayoutParameters = lp;
61 |
62 | // -- Remove Shadows
63 | button.StateListAnimator = null;
64 |
65 | var drawable = RoundedBitmapDrawableFactory.Create(Resources, bitmap);
66 |
67 | drawable.CornerRadius = centeredTab.CornerRadius * Resources.DisplayMetrics.Density;
68 | button.Background = drawable;
69 |
70 | centeredLayout.AddView(button);
71 |
72 | button.Click += Image_Click;
73 |
74 | _bottomView.Measure((int)MeasureSpecMode.Unspecified, (int)MeasureSpecMode.Unspecified);
75 |
76 | var flp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WrapContent, FrameLayout.LayoutParams.WrapContent, GravityFlags.CenterHorizontal | GravityFlags.Bottom);
77 | flp.BottomMargin = _bottomView.MeasuredHeight / 2;
78 |
79 | centeredLayout.LayoutParameters = flp;
80 |
81 | var parent = (FrameLayout)_bottomView.Parent?.Parent;
82 | if (parent == null)
83 | return;
84 |
85 | parent.AddView(centeredLayout);
86 | parent.ForceLayout();
87 |
88 | }
89 | }
90 |
91 | private void Image_Click(object sender, EventArgs e)
92 | {
93 | if (ShellItem != null)
94 | {
95 | var tabbar = (VisualElements.ExtendedShellTabBar)ShellItem;
96 | var centeredTab = tabbar.CenteredTab;
97 | centeredTab.Command?.Execute(centeredTab);
98 | }
99 | }
100 |
101 | public override void OnDestroy()
102 | {
103 | base.OnDestroy();
104 | button.Click -= Image_Click;
105 | }
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.809.10
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExtendedShellTabBarSample.Android", "ExtendedShellTabBarSample.Android\ExtendedShellTabBarSample.Android.csproj", "{938A1F25-92A9-43A7-97A1-696C0219DD3F}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExtendedShellTabBarSample.iOS", "ExtendedShellTabBarSample.iOS\ExtendedShellTabBarSample.iOS.csproj", "{EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExtendedShellTabBarSample", "ExtendedShellTabBarSample\ExtendedShellTabBarSample.csproj", "{E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}"
11 | EndProject
12 | Global
13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
14 | Debug|Any CPU = Debug|Any CPU
15 | Release|Any CPU = Release|Any CPU
16 | Debug|iPhoneSimulator = Debug|iPhoneSimulator
17 | Release|iPhoneSimulator = Release|iPhoneSimulator
18 | Debug|iPhone = Debug|iPhone
19 | Release|iPhone = Release|iPhone
20 | EndGlobalSection
21 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
22 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
23 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
24 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
25 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Release|Any CPU.Build.0 = Release|Any CPU
26 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
27 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
28 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
29 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
30 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Debug|iPhone.ActiveCfg = Debug|Any CPU
31 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Debug|iPhone.Build.0 = Debug|Any CPU
32 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Release|iPhone.ActiveCfg = Release|Any CPU
33 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}.Release|iPhone.Build.0 = Release|Any CPU
34 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
35 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
36 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
37 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
38 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
39 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
40 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
41 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
42 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Debug|iPhone.ActiveCfg = Debug|iPhone
43 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Debug|iPhone.Build.0 = Debug|iPhone
44 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Release|iPhone.ActiveCfg = Release|iPhone
45 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}.Release|iPhone.Build.0 = Release|iPhone
46 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
47 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
48 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
49 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Release|Any CPU.Build.0 = Release|Any CPU
50 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
51 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
52 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
53 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
54 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Debug|iPhone.ActiveCfg = Debug|Any CPU
55 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Debug|iPhone.Build.0 = Debug|Any CPU
56 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Release|iPhone.ActiveCfg = Release|Any CPU
57 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}.Release|iPhone.Build.0 = Release|Any CPU
58 | EndGlobalSection
59 | GlobalSection(SolutionProperties) = preSolution
60 | HideSolutionNode = FALSE
61 | EndGlobalSection
62 | GlobalSection(ExtensibilityGlobals) = postSolution
63 | SolutionGuid = {CFE90B62-A938-4A14-8F2E-DACD28B01633}
64 | EndGlobalSection
65 | EndGlobal
66 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.Android/ExtendedShellTabBarSample.Android.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | {938A1F25-92A9-43A7-97A1-696C0219DD3F}
7 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
8 | {6968b3a4-1835-46a3-ac5c-1ae33b475983}
9 | Library
10 | ExtendedShellTabBarSample.Droid
11 | ExtendedShellTabBarSample.Android
12 | True
13 | True
14 | Resources\Resource.designer.cs
15 | Resource
16 | Properties\AndroidManifest.xml
17 | Resources
18 | Assets
19 | v11.0
20 | true
21 | true
22 | Xamarin.Android.Net.AndroidClientHandler
23 |
24 |
25 |
26 |
27 | true
28 | portable
29 | false
30 | bin\Debug
31 | DEBUG;
32 | prompt
33 | 4
34 | None
35 | true
36 |
37 |
38 | true
39 | portable
40 | true
41 | bin\Release
42 | prompt
43 | 4
44 | true
45 | false
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | 1.0.2
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}
119 | ExtendedShellTabBarSample
120 |
121 |
122 |
123 |
124 |
--------------------------------------------------------------------------------
/SampleApp/ExtendedShellTabBarSample.iOS/ExtendedShellTabBarSample.iOS.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | iPhoneSimulator
6 | 8.0.30703
7 | 2.0
8 | {EA3E8969-7B15-4219-8EDE-CFBE952AA7EA}
9 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
10 | {89a4fe7c-635d-49c9-8d8c-5cd363c0d68d}
11 | Exe
12 | ExtendedShellTabBarSample.iOS
13 | Resources
14 | ExtendedShellTabBarSample.iOS
15 | true
16 | NSUrlSessionHandler
17 | automatic
18 |
19 |
20 | true
21 | full
22 | false
23 | bin\iPhoneSimulator\Debug
24 | DEBUG
25 | prompt
26 | 4
27 | x86_64
28 | None
29 | true
30 |
31 |
32 | none
33 | true
34 | bin\iPhoneSimulator\Release
35 | prompt
36 | 4
37 | None
38 | x86_64
39 |
40 |
41 | true
42 | full
43 | false
44 | bin\iPhone\Debug
45 | DEBUG
46 | prompt
47 | 4
48 | ARM64
49 | iPhone Developer
50 | true
51 | Entitlements.plist
52 | None
53 | -all
54 |
55 |
56 | none
57 | true
58 | bin\iPhone\Release
59 | prompt
60 | 4
61 | ARM64
62 | iPhone Developer
63 | Entitlements.plist
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | false
75 |
76 |
77 | false
78 |
79 |
80 | false
81 |
82 |
83 | false
84 |
85 |
86 | false
87 |
88 |
89 | false
90 |
91 |
92 | false
93 |
94 |
95 | false
96 |
97 |
98 | false
99 |
100 |
101 | false
102 |
103 |
104 | false
105 |
106 |
107 | false
108 |
109 |
110 | false
111 |
112 |
113 | false
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 | False
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 | 1.0.2
145 |
146 |
147 |
148 |
149 |
150 | {E3B9E7D1-8F84-4A6B-99A3-FEA6AD7CB5BB}
151 | ExtendedShellTabBarSample
152 |
153 |
154 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # globs
2 | Makefile.in
3 | *.userprefs
4 | *.usertasks
5 | config.make
6 | config.status
7 | aclocal.m4
8 | install-sh
9 | autom4te.cache/
10 | *.tar.gz
11 | tarballs/
12 | test-results/
13 |
14 | # Mac bundle stuff
15 | *.dmg
16 | *.app
17 |
18 | # content below from: https://github.com/github/gitignore/blob/main/Global/macOS.gitignore
19 | # General
20 | .DS_Store
21 | .AppleDouble
22 | .LSOverride
23 |
24 | # Icon must end with two \r
25 | Icon
26 |
27 |
28 | # Thumbnails
29 | ._*
30 |
31 | # Files that might appear in the root of a volume
32 | .DocumentRevisions-V100
33 | .fseventsd
34 | .Spotlight-V100
35 | .TemporaryItems
36 | .Trashes
37 | .VolumeIcon.icns
38 | .com.apple.timemachine.donotpresent
39 |
40 | # Directories potentially created on remote AFP share
41 | .AppleDB
42 | .AppleDesktop
43 | Network Trash Folder
44 | Temporary Items
45 | .apdisk
46 |
47 | # content below from: https://github.com/github/gitignore/blob/main/Global/Windows.gitignore
48 | # Windows thumbnail cache files
49 | Thumbs.db
50 | ehthumbs.db
51 | ehthumbs_vista.db
52 |
53 | # Dump file
54 | *.stackdump
55 |
56 | # Folder config file
57 | [Dd]esktop.ini
58 |
59 | # Recycle Bin used on file shares
60 | $RECYCLE.BIN/
61 |
62 | # Windows Installer files
63 | *.cab
64 | *.msi
65 | *.msix
66 | *.msm
67 | *.msp
68 |
69 | # Windows shortcuts
70 | *.lnk
71 |
72 | # content below from: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
73 | ## Ignore Visual Studio temporary files, build results, and
74 | ## files generated by popular Visual Studio add-ons.
75 | ##
76 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
77 |
78 | # User-specific files
79 | *.suo
80 | *.user
81 | *.userosscache
82 | *.sln.docstates
83 |
84 | # User-specific files (MonoDevelop/Xamarin Studio)
85 | *.userprefs
86 |
87 | # Build results
88 | [Dd]ebug/
89 | [Dd]ebugPublic/
90 | [Rr]elease/
91 | [Rr]eleases/
92 | x64/
93 | x86/
94 | bld/
95 | [Bb]in/
96 | [Oo]bj/
97 | [Ll]og/
98 |
99 | # Visual Studio 2015/2017 cache/options directory
100 | .vs/
101 | # Uncomment if you have tasks that create the project's static files in wwwroot
102 | #wwwroot/
103 |
104 | # Visual Studio 2017 auto generated files
105 | Generated\ Files/
106 |
107 | # MSTest test Results
108 | [Tt]est[Rr]esult*/
109 | [Bb]uild[Ll]og.*
110 |
111 | # NUNIT
112 | *.VisualState.xml
113 | TestResult.xml
114 |
115 | # Build Results of an ATL Project
116 | [Dd]ebugPS/
117 | [Rr]eleasePS/
118 | dlldata.c
119 |
120 | # Benchmark Results
121 | BenchmarkDotNet.Artifacts/
122 |
123 | # .NET Core
124 | project.lock.json
125 | project.fragment.lock.json
126 | artifacts/
127 |
128 | # StyleCop
129 | StyleCopReport.xml
130 |
131 | # Files built by Visual Studio
132 | *_i.c
133 | *_p.c
134 | *_h.h
135 | *.ilk
136 | *.meta
137 | *.obj
138 | *.iobj
139 | *.pch
140 | *.pdb
141 | *.ipdb
142 | *.pgc
143 | *.pgd
144 | *.rsp
145 | *.sbr
146 | *.tlb
147 | *.tli
148 | *.tlh
149 | *.tmp
150 | *.tmp_proj
151 | *_wpftmp.csproj
152 | *.log
153 | *.vspscc
154 | *.vssscc
155 | .builds
156 | *.pidb
157 | *.svclog
158 | *.scc
159 |
160 | # Chutzpah Test files
161 | _Chutzpah*
162 |
163 | # Visual C++ cache files
164 | ipch/
165 | *.aps
166 | *.ncb
167 | *.opendb
168 | *.opensdf
169 | *.sdf
170 | *.cachefile
171 | *.VC.db
172 | *.VC.VC.opendb
173 |
174 | # Visual Studio profiler
175 | *.psess
176 | *.vsp
177 | *.vspx
178 | *.sap
179 |
180 | # Visual Studio Trace Files
181 | *.e2e
182 |
183 | # TFS 2012 Local Workspace
184 | $tf/
185 |
186 | # Guidance Automation Toolkit
187 | *.gpState
188 |
189 | # ReSharper is a .NET coding add-in
190 | _ReSharper*/
191 | *.[Rr]e[Ss]harper
192 | *.DotSettings.user
193 |
194 | # JustCode is a .NET coding add-in
195 | .JustCode
196 |
197 | # TeamCity is a build add-in
198 | _TeamCity*
199 |
200 | # DotCover is a Code Coverage Tool
201 | *.dotCover
202 |
203 | # AxoCover is a Code Coverage Tool
204 | .axoCover/*
205 | !.axoCover/settings.json
206 |
207 | # Visual Studio code coverage results
208 | *.coverage
209 | *.coveragexml
210 |
211 | # NCrunch
212 | _NCrunch_*
213 | .*crunch*.local.xml
214 | nCrunchTemp_*
215 |
216 | # MightyMoose
217 | *.mm.*
218 | AutoTest.Net/
219 |
220 | # Web workbench (sass)
221 | .sass-cache/
222 |
223 | # Installshield output folder
224 | [Ee]xpress/
225 |
226 | # DocProject is a documentation generator add-in
227 | DocProject/buildhelp/
228 | DocProject/Help/*.HxT
229 | DocProject/Help/*.HxC
230 | DocProject/Help/*.hhc
231 | DocProject/Help/*.hhk
232 | DocProject/Help/*.hhp
233 | DocProject/Help/Html2
234 | DocProject/Help/html
235 |
236 | # Click-Once directory
237 | publish/
238 |
239 | # Publish Web Output
240 | *.[Pp]ublish.xml
241 | *.azurePubxml
242 | # Note: Comment the next line if you want to checkin your web deploy settings,
243 | # but database connection strings (with potential passwords) will be unencrypted
244 | *.pubxml
245 | *.publishproj
246 |
247 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
248 | # checkin your Azure Web App publish settings, but sensitive information contained
249 | # in these scripts will be unencrypted
250 | PublishScripts/
251 |
252 | # NuGet Packages
253 | *.nupkg
254 | # The packages folder can be ignored because of Package Restore
255 | **/[Pp]ackages/*
256 | # except build/, which is used as an MSBuild target.
257 | !**/[Pp]ackages/build/
258 | # Uncomment if necessary however generally it will be regenerated when needed
259 | #!**/[Pp]ackages/repositories.config
260 | # NuGet v3's project.json files produces more ignorable files
261 | *.nuget.props
262 | *.nuget.targets
263 |
264 | # Microsoft Azure Build Output
265 | csx/
266 | *.build.csdef
267 |
268 | # Microsoft Azure Emulator
269 | ecf/
270 | rcf/
271 |
272 | # Windows Store app package directories and files
273 | AppPackages/
274 | BundleArtifacts/
275 | Package.StoreAssociation.xml
276 | _pkginfo.txt
277 | *.appx
278 |
279 | # Visual Studio cache files
280 | # files ending in .cache can be ignored
281 | *.[Cc]ache
282 | # but keep track of directories ending in .cache
283 | !*.[Cc]ache/
284 |
285 | # Others
286 | ClientBin/
287 | ~$*
288 | *~
289 | *.dbmdl
290 | *.dbproj.schemaview
291 | *.jfm
292 | *.pfx
293 | *.publishsettings
294 | orleans.codegen.cs
295 |
296 | # Including strong name files can present a security risk
297 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
298 | #*.snk
299 |
300 | # Since there are multiple workflows, uncomment next line to ignore bower_components
301 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
302 | #bower_components/
303 |
304 | # RIA/Silverlight projects
305 | Generated_Code/
306 |
307 | # Backup & report files from converting an old project file
308 | # to a newer Visual Studio version. Backup files are not needed,
309 | # because we have git ;-)
310 | _UpgradeReport_Files/
311 | Backup*/
312 | UpgradeLog*.XML
313 | UpgradeLog*.htm
314 | ServiceFabricBackup/
315 | *.rptproj.bak
316 |
317 | # SQL Server files
318 | *.mdf
319 | *.ldf
320 | *.ndf
321 |
322 | # Business Intelligence projects
323 | *.rdl.data
324 | *.bim.layout
325 | *.bim_*.settings
326 | *.rptproj.rsuser
327 |
328 | # Microsoft Fakes
329 | FakesAssemblies/
330 |
331 | # GhostDoc plugin setting file
332 | *.GhostDoc.xml
333 |
334 | # Node.js Tools for Visual Studio
335 | .ntvs_analysis.dat
336 | node_modules/
337 |
338 | # Visual Studio 6 build log
339 | *.plg
340 |
341 | # Visual Studio 6 workspace options file
342 | *.opt
343 |
344 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
345 | *.vbw
346 |
347 | # Visual Studio LightSwitch build output
348 | **/*.HTMLClient/GeneratedArtifacts
349 | **/*.DesktopClient/GeneratedArtifacts
350 | **/*.DesktopClient/ModelManifest.xml
351 | **/*.Server/GeneratedArtifacts
352 | **/*.Server/ModelManifest.xml
353 | _Pvt_Extensions
354 |
355 | # Paket dependency manager
356 | .paket/paket.exe
357 | paket-files/
358 |
359 | # FAKE - F# Make
360 | .fake/
361 |
362 | # JetBrains Rider
363 | .idea/
364 | *.sln.iml
365 |
366 | # CodeRush personal settings
367 | .cr/personal
368 |
369 | # Python Tools for Visual Studio (PTVS)
370 | __pycache__/
371 | *.pyc
372 |
373 | # Cake - Uncomment if you are using it
374 | # tools/**
375 | # !tools/packages.config
376 |
377 | # Tabs Studio
378 | *.tss
379 |
380 | # Telerik's JustMock configuration file
381 | *.jmconfig
382 |
383 | # BizTalk build output
384 | *.btp.cs
385 | *.btm.cs
386 | *.odx.cs
387 | *.xsd.cs
388 |
389 | # OpenCover UI analysis results
390 | OpenCover/
391 |
392 | # Azure Stream Analytics local run output
393 | ASALocalRun/
394 |
395 | # MSBuild Binary and Structured Log
396 | *.binlog
397 |
398 | # NVidia Nsight GPU debugger configuration file
399 | *.nvuser
400 |
401 | # MFractors (Xamarin productivity tool) working folder
402 | .mfractor/
403 |
404 | # Local History for Visual Studio
405 | .localhistory/
--------------------------------------------------------------------------------
/SampleApp/.gitignore:
--------------------------------------------------------------------------------
1 | # globs
2 | Makefile.in
3 | *.userprefs
4 | *.usertasks
5 | config.make
6 | config.status
7 | aclocal.m4
8 | install-sh
9 | autom4te.cache/
10 | *.tar.gz
11 | tarballs/
12 | test-results/
13 |
14 | # Mac bundle stuff
15 | *.dmg
16 | *.app
17 |
18 | # content below from: https://github.com/github/gitignore/blob/main/Global/macOS.gitignore
19 | # General
20 | .DS_Store
21 | .AppleDouble
22 | .LSOverride
23 |
24 | # Icon must end with two \r
25 | Icon
26 |
27 |
28 | # Thumbnails
29 | ._*
30 |
31 | # Files that might appear in the root of a volume
32 | .DocumentRevisions-V100
33 | .fseventsd
34 | .Spotlight-V100
35 | .TemporaryItems
36 | .Trashes
37 | .VolumeIcon.icns
38 | .com.apple.timemachine.donotpresent
39 |
40 | # Directories potentially created on remote AFP share
41 | .AppleDB
42 | .AppleDesktop
43 | Network Trash Folder
44 | Temporary Items
45 | .apdisk
46 |
47 | # content below from: https://github.com/github/gitignore/blob/main/Global/Windows.gitignore
48 | # Windows thumbnail cache files
49 | Thumbs.db
50 | ehthumbs.db
51 | ehthumbs_vista.db
52 |
53 | # Dump file
54 | *.stackdump
55 |
56 | # Folder config file
57 | [Dd]esktop.ini
58 |
59 | # Recycle Bin used on file shares
60 | $RECYCLE.BIN/
61 |
62 | # Windows Installer files
63 | *.cab
64 | *.msi
65 | *.msix
66 | *.msm
67 | *.msp
68 |
69 | # Windows shortcuts
70 | *.lnk
71 |
72 | # content below from: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
73 | ## Ignore Visual Studio temporary files, build results, and
74 | ## files generated by popular Visual Studio add-ons.
75 | ##
76 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
77 |
78 | # User-specific files
79 | *.suo
80 | *.user
81 | *.userosscache
82 | *.sln.docstates
83 |
84 | # User-specific files (MonoDevelop/Xamarin Studio)
85 | *.userprefs
86 |
87 | # Build results
88 | [Dd]ebug/
89 | [Dd]ebugPublic/
90 | [Rr]elease/
91 | [Rr]eleases/
92 | x64/
93 | x86/
94 | bld/
95 | [Bb]in/
96 | [Oo]bj/
97 | [Ll]og/
98 |
99 | # Visual Studio 2015/2017 cache/options directory
100 | .vs/
101 | # Uncomment if you have tasks that create the project's static files in wwwroot
102 | #wwwroot/
103 |
104 | # Visual Studio 2017 auto generated files
105 | Generated\ Files/
106 |
107 | # MSTest test Results
108 | [Tt]est[Rr]esult*/
109 | [Bb]uild[Ll]og.*
110 |
111 | # NUNIT
112 | *.VisualState.xml
113 | TestResult.xml
114 |
115 | # Build Results of an ATL Project
116 | [Dd]ebugPS/
117 | [Rr]eleasePS/
118 | dlldata.c
119 |
120 | # Benchmark Results
121 | BenchmarkDotNet.Artifacts/
122 |
123 | # .NET Core
124 | project.lock.json
125 | project.fragment.lock.json
126 | artifacts/
127 |
128 | # StyleCop
129 | StyleCopReport.xml
130 |
131 | # Files built by Visual Studio
132 | *_i.c
133 | *_p.c
134 | *_h.h
135 | *.ilk
136 | *.meta
137 | *.obj
138 | *.iobj
139 | *.pch
140 | *.pdb
141 | *.ipdb
142 | *.pgc
143 | *.pgd
144 | *.rsp
145 | *.sbr
146 | *.tlb
147 | *.tli
148 | *.tlh
149 | *.tmp
150 | *.tmp_proj
151 | *_wpftmp.csproj
152 | *.log
153 | *.vspscc
154 | *.vssscc
155 | .builds
156 | *.pidb
157 | *.svclog
158 | *.scc
159 |
160 | # Chutzpah Test files
161 | _Chutzpah*
162 |
163 | # Visual C++ cache files
164 | ipch/
165 | *.aps
166 | *.ncb
167 | *.opendb
168 | *.opensdf
169 | *.sdf
170 | *.cachefile
171 | *.VC.db
172 | *.VC.VC.opendb
173 |
174 | # Visual Studio profiler
175 | *.psess
176 | *.vsp
177 | *.vspx
178 | *.sap
179 |
180 | # Visual Studio Trace Files
181 | *.e2e
182 |
183 | # TFS 2012 Local Workspace
184 | $tf/
185 |
186 | # Guidance Automation Toolkit
187 | *.gpState
188 |
189 | # ReSharper is a .NET coding add-in
190 | _ReSharper*/
191 | *.[Rr]e[Ss]harper
192 | *.DotSettings.user
193 |
194 | # JustCode is a .NET coding add-in
195 | .JustCode
196 |
197 | # TeamCity is a build add-in
198 | _TeamCity*
199 |
200 | # DotCover is a Code Coverage Tool
201 | *.dotCover
202 |
203 | # AxoCover is a Code Coverage Tool
204 | .axoCover/*
205 | !.axoCover/settings.json
206 |
207 | # Visual Studio code coverage results
208 | *.coverage
209 | *.coveragexml
210 |
211 | # NCrunch
212 | _NCrunch_*
213 | .*crunch*.local.xml
214 | nCrunchTemp_*
215 |
216 | # MightyMoose
217 | *.mm.*
218 | AutoTest.Net/
219 |
220 | # Web workbench (sass)
221 | .sass-cache/
222 |
223 | # Installshield output folder
224 | [Ee]xpress/
225 |
226 | # DocProject is a documentation generator add-in
227 | DocProject/buildhelp/
228 | DocProject/Help/*.HxT
229 | DocProject/Help/*.HxC
230 | DocProject/Help/*.hhc
231 | DocProject/Help/*.hhk
232 | DocProject/Help/*.hhp
233 | DocProject/Help/Html2
234 | DocProject/Help/html
235 |
236 | # Click-Once directory
237 | publish/
238 |
239 | # Publish Web Output
240 | *.[Pp]ublish.xml
241 | *.azurePubxml
242 | # Note: Comment the next line if you want to checkin your web deploy settings,
243 | # but database connection strings (with potential passwords) will be unencrypted
244 | *.pubxml
245 | *.publishproj
246 |
247 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
248 | # checkin your Azure Web App publish settings, but sensitive information contained
249 | # in these scripts will be unencrypted
250 | PublishScripts/
251 |
252 | # NuGet Packages
253 | *.nupkg
254 | # The packages folder can be ignored because of Package Restore
255 | **/[Pp]ackages/*
256 | # except build/, which is used as an MSBuild target.
257 | !**/[Pp]ackages/build/
258 | # Uncomment if necessary however generally it will be regenerated when needed
259 | #!**/[Pp]ackages/repositories.config
260 | # NuGet v3's project.json files produces more ignorable files
261 | *.nuget.props
262 | *.nuget.targets
263 |
264 | # Microsoft Azure Build Output
265 | csx/
266 | *.build.csdef
267 |
268 | # Microsoft Azure Emulator
269 | ecf/
270 | rcf/
271 |
272 | # Windows Store app package directories and files
273 | AppPackages/
274 | BundleArtifacts/
275 | Package.StoreAssociation.xml
276 | _pkginfo.txt
277 | *.appx
278 |
279 | # Visual Studio cache files
280 | # files ending in .cache can be ignored
281 | *.[Cc]ache
282 | # but keep track of directories ending in .cache
283 | !*.[Cc]ache/
284 |
285 | # Others
286 | ClientBin/
287 | ~$*
288 | *~
289 | *.dbmdl
290 | *.dbproj.schemaview
291 | *.jfm
292 | *.pfx
293 | *.publishsettings
294 | orleans.codegen.cs
295 |
296 | # Including strong name files can present a security risk
297 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
298 | #*.snk
299 |
300 | # Since there are multiple workflows, uncomment next line to ignore bower_components
301 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
302 | #bower_components/
303 |
304 | # RIA/Silverlight projects
305 | Generated_Code/
306 |
307 | # Backup & report files from converting an old project file
308 | # to a newer Visual Studio version. Backup files are not needed,
309 | # because we have git ;-)
310 | _UpgradeReport_Files/
311 | Backup*/
312 | UpgradeLog*.XML
313 | UpgradeLog*.htm
314 | ServiceFabricBackup/
315 | *.rptproj.bak
316 |
317 | # SQL Server files
318 | *.mdf
319 | *.ldf
320 | *.ndf
321 |
322 | # Business Intelligence projects
323 | *.rdl.data
324 | *.bim.layout
325 | *.bim_*.settings
326 | *.rptproj.rsuser
327 |
328 | # Microsoft Fakes
329 | FakesAssemblies/
330 |
331 | # GhostDoc plugin setting file
332 | *.GhostDoc.xml
333 |
334 | # Node.js Tools for Visual Studio
335 | .ntvs_analysis.dat
336 | node_modules/
337 |
338 | # Visual Studio 6 build log
339 | *.plg
340 |
341 | # Visual Studio 6 workspace options file
342 | *.opt
343 |
344 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
345 | *.vbw
346 |
347 | # Visual Studio LightSwitch build output
348 | **/*.HTMLClient/GeneratedArtifacts
349 | **/*.DesktopClient/GeneratedArtifacts
350 | **/*.DesktopClient/ModelManifest.xml
351 | **/*.Server/GeneratedArtifacts
352 | **/*.Server/ModelManifest.xml
353 | _Pvt_Extensions
354 |
355 | # Paket dependency manager
356 | .paket/paket.exe
357 | paket-files/
358 |
359 | # FAKE - F# Make
360 | .fake/
361 |
362 | # JetBrains Rider
363 | .idea/
364 | *.sln.iml
365 |
366 | # CodeRush personal settings
367 | .cr/personal
368 |
369 | # Python Tools for Visual Studio (PTVS)
370 | __pycache__/
371 | *.pyc
372 |
373 | # Cake - Uncomment if you are using it
374 | # tools/**
375 | # !tools/packages.config
376 |
377 | # Tabs Studio
378 | *.tss
379 |
380 | # Telerik's JustMock configuration file
381 | *.jmconfig
382 |
383 | # BizTalk build output
384 | *.btp.cs
385 | *.btm.cs
386 | *.odx.cs
387 | *.xsd.cs
388 |
389 | # OpenCover UI analysis results
390 | OpenCover/
391 |
392 | # Azure Stream Analytics local run output
393 | ASALocalRun/
394 |
395 | # MSBuild Binary and Structured Log
396 | *.binlog
397 |
398 | # NVidia Nsight GPU debugger configuration file
399 | *.nvuser
400 |
401 | # MFractors (Xamarin productivity tool) working folder
402 | .mfractor/
403 |
404 | # Local History for Visual Studio
405 | .localhistory/
--------------------------------------------------------------------------------