Repository: thrive-now/BottomNavigationBarXF
Branch: master
Commit: eae99875fb2c
Files: 67
Total size: 141.6 KB
Directory structure:
gitextract_5bvqld56/
├── .gitignore
├── BottomBar.Droid/
│ ├── BottomBar.Droid.csproj
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Renderers/
│ │ └── BottomBarPageRenderer.cs
│ ├── Resources/
│ │ ├── AboutResources.txt
│ │ └── values/
│ │ └── Strings.xml
│ ├── Utils/
│ │ ├── IPageController.cs
│ │ ├── MeasureSpecFactory.cs
│ │ ├── PageController.cs
│ │ ├── ReflectedProxy.cs
│ │ └── ResourceManagerEx.cs
│ └── packages.config
├── BottomBar.XamarinForms/
│ ├── BottomBar.XamarinForms.csproj
│ ├── BottomBarPage.cs
│ ├── BottomBarPageExtensions.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ └── packages.config
├── BottomBar.nuspec
├── BottomBarXF.sln
├── LICENSE
├── README.md
├── example/
│ ├── BottomBarXFExample/
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── BottomBarXFExample.csproj
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ ├── TabPage.xaml
│ │ ├── TabPage.xaml.cs
│ │ └── packages.config
│ ├── BottomBarXFExample.Droid/
│ │ ├── Assets/
│ │ │ └── AboutAssets.txt
│ │ ├── BottomBarXFExample.Droid.csproj
│ │ ├── MainActivity.cs
│ │ ├── Properties/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── AssemblyInfo.cs
│ │ ├── Resources/
│ │ │ ├── AboutResources.txt
│ │ │ ├── layout/
│ │ │ │ ├── Tabbar.axml
│ │ │ │ └── Toolbar.axml
│ │ │ └── values/
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ └── packages.config
│ └── BottomBarXFExample.iOS/
│ ├── AppDelegate.cs
│ ├── BottomBarXFExample.iOS.csproj
│ ├── Entitlements.plist
│ ├── Info.plist
│ ├── Main.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Resources/
│ │ └── LaunchScreen.xib
│ └── packages.config
└── example-xaml/
├── BottomBarXFExampleXaml/
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── BarPage.xaml
│ ├── BarPage.xaml.cs
│ ├── BottomBarXFExampleXaml.csproj
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── TabPage.xaml
│ ├── TabPage.xaml.cs
│ └── packages.config
└── BottomBarXFExampleXaml.Droid/
├── Assets/
│ └── AboutAssets.txt
├── BottomBarXFExampleXaml.Droid.csproj
├── MainActivity.cs
├── Properties/
│ ├── AndroidManifest.xml
│ └── AssemblyInfo.cs
├── Resources/
│ ├── AboutResources.txt
│ ├── layout/
│ │ ├── Tabbar.axml
│ │ └── Toolbar.axml
│ └── values/
│ ├── colors.xml
│ └── styles.xml
└── packages.config
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
## Xamarin stuff
Components
[Pp]ackages
*.userprefs
Resource.designer.cs
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
x64/
build/
bld/
[Bb]in/
[Oo]bj/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
#NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding addin-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
*.ncrunch*
_NCrunch_*
.*crunch*.local.xml
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# NuGet Packages Directory
packages/
## TODO: If the tool you use requires repositories.config uncomment the next line
#!packages/repositories.config
# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets
# This line needs to be after the ignore of the build folder (and the packages folder if the line above has been uncommented)
!packages/build/
# Windows Azure Build Output
csx/
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
*.userprefs
.DS_Store
================================================
FILE: BottomBar.Droid/BottomBar.Droid.csproj
================================================
23.0.3DebugAnyCPU{96746A3E-074D-40C6-B2E2-CA90313012C6}{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}LibraryBottomBar.DroidBottomBar.Droidv6.0Resources\Resource.designer.csResourceResourcesAssetsfalse0.8truefullfalsebin\DebugDEBUG;prompt4falseNonearm64-v8a;armeabi;armeabi-v7a;x86truebin\Releaseprompt4falsefalse..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Vector.Drawable.dll..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll..\packages\Xamarin.Android.Support.v7.RecyclerView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.RecyclerView.dll..\packages\Xamarin.Android.Support.Design.23.3.0\lib\MonoAndroid43\Xamarin.Android.Support.Design.dll..\packages\Xamarin.Android.Support.v7.CardView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.CardView.dll..\packages\Xamarin.Android.Support.v7.MediaRouter.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.MediaRouter.dll..\packages\Xamarin.Android.Support.v7.AppCompat.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll..\packages\BottomNavigationBar.1.4.0.2\lib\MonoAndroid403\BottomNavigationBar.dll..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\FormsViewGroup.dll..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Core.dll..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Platform.dll..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}BottomBar.XamarinForms
================================================
FILE: BottomBar.Droid/Properties/AssemblyInfo.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Reflection;
using System.Runtime.CompilerServices;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle ("BottomBar.Droid")]
[assembly: AssemblyDescription ("Bottom Bar implementation for Xamarin Forms - Android Renderer")]
[assembly: AssemblyConfiguration ("")]
[assembly: AssemblyCompany ("")]
[assembly: AssemblyProduct ("")]
[assembly: AssemblyCopyright ("sebs")]
[assembly: AssemblyTrademark ("")]
[assembly: AssemblyCulture ("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion ("1.0.0")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]
================================================
FILE: BottomBar.Droid/Renderers/BottomBarPageRenderer.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using BottomBar.XamarinForms;
using BottomNavigationBar;
using BottomNavigationBar.Listeners;
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Xamarin.Forms.Platform.Android.AppCompat;
using BottomBar.Droid.Renderers;
using BottomBar.Droid.Utils;
[assembly: ExportRenderer (typeof (BottomBarPage), typeof (BottomBarPageRenderer))]
namespace BottomBar.Droid.Renderers
{
public class BottomBarPageRenderer : VisualElementRenderer, IOnTabClickListener
{
bool _disposed;
BottomNavigationBar.BottomBar _bottomBar;
FrameLayout _frameLayout;
IPageController _pageController;
IDictionary _badges;
public BottomBarPageRenderer ()
{
AutoPackage = false;
}
#region IOnTabClickListener
public virtual void OnTabSelected (int position)
{
//Do we need this call? It's also done in OnElementPropertyChanged
SwitchContent(Element.Children [position]);
var bottomBarPage = Element as BottomBarPage;
bottomBarPage.CurrentPage = Element.Children[position];
//bottomBarPage.RaiseCurrentPageChanged();
}
public virtual void OnTabReSelected (int position)
{
}
#endregion
protected override void Dispose (bool disposing)
{
if (disposing && !_disposed) {
_disposed = true;
RemoveAllViews ();
foreach (Page pageToRemove in Element.Children) {
IVisualElementRenderer pageRenderer = Platform.GetRenderer (pageToRemove);
if (pageRenderer != null) {
pageRenderer.ViewGroup.RemoveFromParent ();
pageRenderer.Dispose ();
}
pageToRemove.PropertyChanged -= OnPagePropertyChanged;
// pageToRemove.ClearValue (Platform.RendererProperty);
}
if (_badges != null)
{
_badges.Clear();
_badges = null;
}
if (_bottomBar != null) {
_bottomBar.SetOnTabClickListener (null);
_bottomBar.Dispose ();
_bottomBar = null;
}
if (_frameLayout != null) {
_frameLayout.Dispose ();
_frameLayout = null;
}
/*if (Element != null) {
PageController.InternalChildren.CollectionChanged -= OnChildrenCollectionChanged;
}*/
}
base.Dispose (disposing);
}
protected override void OnAttachedToWindow ()
{
base.OnAttachedToWindow ();
_pageController.SendAppearing ();
}
protected override void OnDetachedFromWindow ()
{
base.OnDetachedFromWindow ();
_pageController.SendDisappearing ();
}
protected override void OnElementChanged (ElementChangedEventArgs e)
{
base.OnElementChanged (e);
if (e.NewElement != null) {
BottomBarPage bottomBarPage = e.NewElement;
if (_bottomBar == null) {
_pageController = PageController.Create (bottomBarPage);
// create a view which will act as container for Page's
_frameLayout = new FrameLayout (Forms.Context);
_frameLayout.LayoutParameters = new FrameLayout.LayoutParams (LayoutParams.MatchParent, LayoutParams.MatchParent, GravityFlags.Fill);
AddView (_frameLayout, 0);
// create bottomBar control
_bottomBar = BottomNavigationBar.BottomBar.Attach (_frameLayout, null);
_bottomBar.NoTabletGoodness ();
if (bottomBarPage.FixedMode)
{
_bottomBar.UseFixedMode();
}
switch (bottomBarPage.BarTheme)
{
case BottomBarPage.BarThemeTypes.Light:
break;
case BottomBarPage.BarThemeTypes.DarkWithAlpha:
_bottomBar.UseDarkThemeWithAlpha(true);
break;
case BottomBarPage.BarThemeTypes.DarkWithoutAlpha:
_bottomBar.UseDarkThemeWithAlpha(false);
break;
default:
throw new ArgumentOutOfRangeException();
}
_bottomBar.LayoutParameters = new LayoutParams (LayoutParams.MatchParent, LayoutParams.MatchParent);
_bottomBar.SetOnTabClickListener (this);
UpdateTabs ();
UpdateBarBackgroundColor ();
UpdateBarTextColor ();
}
if (bottomBarPage.CurrentPage != null) {
SwitchContent (bottomBarPage.CurrentPage);
}
}
}
protected override void OnElementPropertyChanged (object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == nameof (TabbedPage.CurrentPage)) {
SwitchContent (Element.CurrentPage);
UpdateSelectedTabIndex(Element.CurrentPage);
} else if (e.PropertyName == NavigationPage.BarBackgroundColorProperty.PropertyName) {
UpdateBarBackgroundColor ();
} else if (e.PropertyName == NavigationPage.BarTextColorProperty.PropertyName) {
UpdateBarTextColor ();
}
}
protected virtual void SwitchContent (Page view)
{
Context.HideKeyboard (this);
_frameLayout.RemoveAllViews ();
if (view == null) {
return;
}
if (Platform.GetRenderer (view) == null) {
Platform.SetRenderer (view, Platform.CreateRenderer (view));
}
_frameLayout.AddView (Platform.GetRenderer (view).ViewGroup);
}
protected override void OnLayout (bool changed, int l, int t, int r, int b)
{
int width = r - l;
int height = b - t;
var context = Context;
_bottomBar.Measure (MeasureSpecFactory.MakeMeasureSpec (width, MeasureSpecMode.Exactly), MeasureSpecFactory.MakeMeasureSpec (height, MeasureSpecMode.AtMost));
int tabsHeight = Math.Min (height, Math.Max (_bottomBar.MeasuredHeight, _bottomBar.MinimumHeight));
if (width > 0 && height > 0) {
_pageController.ContainerArea = new Rectangle(0, 0, context.FromPixels(width), context.FromPixels(_frameLayout.MeasuredHeight));
ObservableCollection internalChildren = _pageController.InternalChildren;
for (var i = 0; i < internalChildren.Count; i++) {
var child = internalChildren [i] as VisualElement;
if (child == null) {
continue;
}
IVisualElementRenderer renderer = Platform.GetRenderer (child);
var navigationRenderer = renderer as NavigationPageRenderer;
if (navigationRenderer != null) {
// navigationRenderer.ContainerPadding = tabsHeight;
}
}
_bottomBar.Measure (MeasureSpecFactory.MakeMeasureSpec (width, MeasureSpecMode.Exactly), MeasureSpecFactory.MakeMeasureSpec (tabsHeight, MeasureSpecMode.Exactly));
_bottomBar.Layout (0, 0, width, tabsHeight);
}
base.OnLayout (changed, l, t, r, b);
}
void UpdateSelectedTabIndex(Page page)
{
var index = Element.Children.IndexOf(page);
_bottomBar.SelectTabAtPosition(index, true);
}
void UpdateBarBackgroundColor ()
{
if (_disposed || _bottomBar == null) {
return;
}
_bottomBar.SetBackgroundColor (Element.BarBackgroundColor.ToAndroid ());
}
void UpdateBarTextColor ()
{
if (_disposed || _bottomBar == null) {
return;
}
_bottomBar.SetActiveTabColor(Element.BarTextColor.ToAndroid());
// The problem SetActiveTabColor does only work in fiexed mode // haven't found yet how to set text color for tab items on_bottomBar, doesn't seem to have a direct way
}
void UpdateTabs ()
{
// create tab items
SetTabItems ();
// set tab colors
SetTabColors ();
SetTabBadges();
AddPropertyChangedHandlersForPages();
}
void SetTabItems ()
{
BottomBarTab [] tabs = Element.Children.Select (page => {
var tabIconId = ResourceManagerEx.IdFromTitle (page.Icon, ResourceManager.DrawableClass);
return new BottomBarTab (tabIconId, page.Title);
}).ToArray ();
if (tabs.Length > 0)
{
_bottomBar.SetItems(tabs);
}
}
void SetTabColors ()
{
for (int i = 0; i < Element.Children.Count; ++i) {
Page page = Element.Children [i];
Color tabColor = BottomBarPageExtensions.GetTabColor(page);
if (tabColor != Color.Transparent)
{
_bottomBar.MapColorForTab (i, tabColor.ToAndroid ());
}
}
}
void SetTabBadges()
{
_badges = new Dictionary(Element.Children.Count);
for(var i = 0; i < Element.Children.Count; i++)
{
var page = Element.Children[i];
CreateOrUpdateBadgeForPage(page);
}
}
void AddPropertyChangedHandlersForPages()
{
foreach (var page in Element.Children)
{
page.PropertyChanged += OnPagePropertyChanged;
}
}
void OnPagePropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == BottomBarPageExtensions.BadgeCountProperty.PropertyName)
{
var page = (Page)sender;
CreateOrUpdateBadgeForPage(page);
}
}
///
/// Creates or updates a badge for a page
///
///
void CreateOrUpdateBadgeForPage(Page page)
{
var pageIndex = Element.Children.IndexOf(page);
var badgeCount = BottomBarPageExtensions.GetBadgeCount(page);
BottomBarBadge badge;
// We'll have to keep track of our badges, otherwise we can't update
// and removing + inserting again gives a crappy user experience
if (_badges.ContainsKey(page))
{
badge = _badges[page];
}
else
{
// Don't need to create a badge when there's no badge to show
if (badgeCount == 0) return;
// BottomBarBadge does not allow us to set color after init. You could, but you'd have to
// do it manually because the circle background logic is hidden from us
var badgeColor = BottomBarPageExtensions.GetBadgeColor(page);
badge = _bottomBar.MakeBadgeForTabAt(pageIndex, badgeColor.ToAndroid(), badgeCount);
_badges.Add(page, badge);
}
// Let's assume that if the new badge count is zero the
// default behavior will be to hide the badge
if (badgeCount == 0)
{
badge.Hide();
}
else
{
badge.Count = badgeCount;
badge.Show();
}
}
}
}
================================================
FILE: BottomBar.Droid/Resources/AboutResources.txt
================================================
Images, layout descriptions, binary blobs and string dictionaries can be included
in your application as resource files. Various Android APIs are designed to
operate on the resource IDs instead of dealing with images, strings or binary blobs
directly.
For example, a sample Android app that contains a user interface layout (main.axml),
an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
would keep its resources in the "Resources" directory of the application:
Resources/
drawable/
icon.png
layout/
main.axml
values/
strings.xml
In order to get the build system to recognize Android resources, set the build action to
"AndroidResource". The native Android APIs do not operate directly with filenames, but
instead operate on resource IDs. When you compile an Android application that uses resources,
the build system will package the resources for distribution and generate a class called "R"
(this is an Android convention) that contains the tokens for each one of the resources
included. For example, for the above Resources layout, this is what the R class would expose:
public class R {
public class drawable {
public const int icon = 0x123;
}
public class layout {
public const int main = 0x456;
}
public class strings {
public const int first_string = 0xabc;
public const int second_string = 0xbcd;
}
}
You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
to reference the layout/main.axml file, or R.strings.first_string to reference the first
string in the dictionary file values/strings.xml.
================================================
FILE: BottomBar.Droid/Resources/values/Strings.xml
================================================
BottomBar.Droid
================================================
FILE: BottomBar.Droid/Utils/IPageController.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.ObjectModel;
using Xamarin.Forms;
namespace BottomBar.Droid
{
public interface IPageController
{
Rectangle ContainerArea { get; set; }
bool IgnoresContainerArea { get; set; }
ObservableCollection InternalChildren { get; }
void SendAppearing ();
void SendDisappearing ();
}
}
================================================
FILE: BottomBar.Droid/Utils/MeasureSpecFactory.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using Android.Views;
namespace BottomBar.Droid.Utils
{
internal static class MeasureSpecFactory
{
public static int GetSize (int measureSpec)
{
const int modeMask = 0x3 << 30;
return measureSpec & ~modeMask;
}
// Literally does the same thing as the android code, 1000x faster because no bridge cross
// benchmarked by calling 1,000,000 times in a loop on actual device
public static int MakeMeasureSpec (int size, MeasureSpecMode mode)
{
return size + (int)mode;
}
}
}
================================================
FILE: BottomBar.Droid/Utils/PageController.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.ObjectModel;
using Xamarin.Forms;
namespace BottomBar.Droid
{
public class PageController : IPageController
{
private ReflectedProxy _proxy;
public static IPageController Create (Page page)
{
return new PageController (page);
}
PageController (Page page)
{
_proxy = new ReflectedProxy (page);
}
public Rectangle ContainerArea {
get {
return _proxy.GetPropertyValue ();
}
set {
_proxy.SetPropertyValue (value);
}
}
public bool IgnoresContainerArea {
get {
return _proxy.GetPropertyValue ();
}
set {
_proxy.SetPropertyValue (value);
}
}
public ObservableCollection InternalChildren {
get {
return _proxy.GetPropertyValue> ();
}
set {
_proxy.SetPropertyValue (value);
}
}
public void SendAppearing ()
{
_proxy.Call ();
}
public void SendDisappearing ()
{
_proxy.Call ();
}
}
}
================================================
FILE: BottomBar.Droid/Utils/ReflectedProxy.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace BottomBar.Droid
{
public class ReflectedProxy where T : class
{
private object _target;
private readonly Dictionary _cachedPropertyInfo;
private readonly Dictionary _cachedMethodInfo;
private readonly IEnumerable _targetPropertyInfoList;
private readonly IEnumerable _targetMethodInfoList;
public ReflectedProxy(T target)
{
_target = target;
_cachedPropertyInfo = new Dictionary();
_cachedMethodInfo = new Dictionary();
TypeInfo typeInfo = typeof(T).GetTypeInfo();
_targetPropertyInfoList = typeInfo.GetRuntimeProperties();
_targetMethodInfoList = typeInfo.GetRuntimeMethods();
}
public void SetPropertyValue(object value, [CallerMemberName] string propertyName = "")
{
GetPropertyInfo(propertyName).SetValue(_target, value);
}
public TPropertyValue GetPropertyValue([CallerMemberName] string propertyName = "")
{
return (TPropertyValue)GetPropertyInfo(propertyName).GetValue(_target);
}
public object Call([CallerMemberName] string methodName = "", object[] parameters = null)
{
if (!_cachedMethodInfo.ContainsKey(methodName))
{
_cachedMethodInfo[methodName] = _targetMethodInfoList.Single(mi => mi.Name == methodName || mi.Name.Contains("." + methodName));
}
return _cachedMethodInfo[methodName].Invoke(_target, parameters);
}
PropertyInfo GetPropertyInfo(string propertyName)
{
if (!_cachedPropertyInfo.ContainsKey(propertyName))
{
_cachedPropertyInfo[propertyName] = _targetPropertyInfoList.Single(pi => pi.Name == propertyName || pi.Name.Contains("." + propertyName));
}
return _cachedPropertyInfo[propertyName];
}
}
}
================================================
FILE: BottomBar.Droid/Utils/ResourceManagerEx.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.IO;
using System.Linq;
using System.Reflection;
namespace BottomBar.Droid.Utils
{
internal static class ResourceManagerEx
{
internal static int IdFromTitle (string title, Type type)
{
string name = Path.GetFileNameWithoutExtension (title);
int id = GetId (type, name);
return id; // Resources.System.GetDrawable (Resource.Drawable.dashboard);
}
static int GetId (Type type, string propertyName)
{
FieldInfo [] props = type.GetFields ();
FieldInfo prop = props.Select (p => p).FirstOrDefault (p => p.Name == propertyName);
if (prop != null)
return (int)prop.GetValue (type);
return 0;
}
}
}
================================================
FILE: BottomBar.Droid/packages.config
================================================
================================================
FILE: BottomBar.XamarinForms/BottomBar.XamarinForms.csproj
================================================
DebugAnyCPU{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}trueLibraryBottomBar.XamarinFormsBottomBar.XamarinFormsv4.5Profile780.8truefullfalsebin\DebugDEBUG;prompt4falsetruebin\Releaseprompt4false..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll..\packages\Xamarin.Forms.2.3.2.127\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Core.dll..\packages\Xamarin.Forms.2.3.2.127\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Platform.dll..\packages\Xamarin.Forms.2.3.2.127\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Xaml.dll
================================================
FILE: BottomBar.XamarinForms/BottomBarPage.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using Xamarin.Forms;
namespace BottomBar.XamarinForms
{
public class BottomBarPage : TabbedPage
{
public enum BarThemeTypes { Light, DarkWithAlpha, DarkWithoutAlpha }
public bool FixedMode { get; set; }
public BarThemeTypes BarTheme { get; set; }
public void RaiseCurrentPageChanged()
{
OnCurrentPageChanged();
}
}
}
================================================
FILE: BottomBar.XamarinForms/BottomBarPageExtensions.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using Xamarin.Forms;
namespace BottomBar.XamarinForms
{
public static class BottomBarPageExtensions
{
#region TabColorProperty
public static readonly BindableProperty TabColorProperty = BindableProperty.CreateAttached(
"TabColor",
typeof(Color),
typeof(BottomBarPageExtensions),
Color.Transparent);
public static readonly BindableProperty BadgeCountProperty = BindableProperty.CreateAttached(
"BadgeCount",
typeof(int),
typeof(BottomBarPageExtensions),
0);
public static readonly BindableProperty BadgeColorProperty = BindableProperty.CreateAttached(
"BadgeColor",
typeof(Color),
typeof(BottomBarPageExtensions),
Color.Red);
public static void SetTabColor(BindableObject bindable, Color color)
{
bindable.SetValue(TabColorProperty, color);
}
public static Color GetTabColor(BindableObject bindable)
{
return (Color)bindable.GetValue(TabColorProperty);
}
public static void SetBadgeCount(BindableObject bindable, int badgeCount)
{
bindable.SetValue(BadgeCountProperty, badgeCount);
}
public static int GetBadgeCount(BindableObject bindable)
{
return (int)bindable.GetValue(BadgeCountProperty);
}
public static void SetBadgeColor(BindableObject bindable, Color color)
{
bindable.SetValue(BadgeColorProperty, color);
}
public static Color GetBadgeColor(BindableObject bindable)
{
return (Color)bindable.GetValue(BadgeColorProperty);
}
#endregion
}
}
================================================
FILE: BottomBar.XamarinForms/Properties/AssemblyInfo.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Reflection;
using System.Runtime.CompilerServices;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle ("BottomBar.XamarinForms")]
[assembly: AssemblyDescription ("Bottom Bar implementation for Xamarin Forms")]
[assembly: AssemblyConfiguration ("")]
[assembly: AssemblyCompany ("")]
[assembly: AssemblyProduct ("")]
[assembly: AssemblyCopyright ("sebs")]
[assembly: AssemblyTrademark ("")]
[assembly: AssemblyCulture ("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion ("1.0.*")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]
================================================
FILE: BottomBar.XamarinForms/packages.config
================================================
================================================
FILE: BottomBar.nuspec
================================================
ThriveGmbH.BottomNavigationBar.XF1.0.2BottomNavigationBar for Xamarin FormsSebastian Schmidt, Lukas Holotahttps://github.com/thrive-now/bottom-navigation-bar-xf/blob/master/LICENSEhttps://github.com/thrive-now/bottom-navigation-bar-xffalseA Bottom Navigation Bar implementation for Xamarin Forms.Copyright 2017bottombar xamarin xamarinforms
================================================
FILE: BottomBarXF.sln
================================================
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BottomBarXFExample", "example\BottomBarXFExample\BottomBarXFExample.csproj", "{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BottomBarXFExample.Droid", "example\BottomBarXFExample.Droid\BottomBarXFExample.Droid.csproj", "{03FE6BCA-AA3B-4689-A829-DB87D51A149E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BottomBar.XamarinForms", "BottomBar.XamarinForms\BottomBar.XamarinForms.csproj", "{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BottomBar.Droid", "BottomBar.Droid\BottomBar.Droid.csproj", "{96746A3E-074D-40C6-B2E2-CA90313012C6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example - XF", "Example - XF", "{21BCEE36-ACC1-40B6-99F8-C55B1EFB24AC}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example - XF XAML", "Example - XF XAML", "{EB8CE116-C94E-4674-82D7-7A2978B32A17}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BottomBarXFExampleXaml", "example-xaml\BottomBarXFExampleXaml\BottomBarXFExampleXaml.csproj", "{D72B487F-AA32-45B3-92B1-C36BC5659CBF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BottomBarXFExampleXaml.Droid", "example-xaml\BottomBarXFExampleXaml.Droid\BottomBarXFExampleXaml.Droid.csproj", "{C5BC9521-E9B9-44E3-A505-256080B78234}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BottomBarXFExample.iOS", "example\BottomBarXFExample.iOS\BottomBarXFExample.iOS.csproj", "{7AB8FBA6-4F0B-409F-B891-104BA3554470}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
Ad-Hoc|iPhone = Ad-Hoc|iPhone
Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
AppStore|Any CPU = AppStore|Any CPU
AppStore|iPhone = AppStore|iPhone
AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
Debug|Any CPU = Debug|Any CPU
Debug|iPhone = Debug|iPhone
Debug|iPhoneSimulator = Debug|iPhoneSimulator
Release|Any CPU = Release|Any CPU
Release|iPhone = Release|iPhone
Release|iPhoneSimulator = Release|iPhoneSimulator
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.AppStore|Any CPU.Build.0 = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.AppStore|iPhone.Build.0 = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Debug|Any CPU.Build.0 = Debug|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Debug|iPhone.Build.0 = Debug|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Release|Any CPU.ActiveCfg = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Release|Any CPU.Build.0 = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Release|iPhone.ActiveCfg = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Release|iPhone.Build.0 = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.AppStore|Any CPU.Build.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.AppStore|iPhone.Build.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.AppStore|iPhone.Deploy.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Debug|iPhone.Build.0 = Debug|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Debug|iPhone.Deploy.0 = Debug|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Release|Any CPU.Build.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Release|Any CPU.Deploy.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Release|iPhone.ActiveCfg = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Release|iPhone.Build.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Release|iPhone.Deploy.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{03FE6BCA-AA3B-4689-A829-DB87D51A149E}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.AppStore|Any CPU.Build.0 = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.AppStore|iPhone.Build.0 = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Debug|iPhone.Build.0 = Debug|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Release|Any CPU.Build.0 = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Release|iPhone.ActiveCfg = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Release|iPhone.Build.0 = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.AppStore|Any CPU.Build.0 = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.AppStore|iPhone.Build.0 = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Debug|iPhone.Build.0 = Debug|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Release|Any CPU.Build.0 = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Release|iPhone.ActiveCfg = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Release|iPhone.Build.0 = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{96746A3E-074D-40C6-B2E2-CA90313012C6}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.AppStore|Any CPU.Build.0 = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.AppStore|iPhone.Build.0 = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Debug|iPhone.Build.0 = Debug|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Release|Any CPU.Build.0 = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Release|iPhone.ActiveCfg = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Release|iPhone.Build.0 = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{D72B487F-AA32-45B3-92B1-C36BC5659CBF}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.AppStore|Any CPU.Build.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.AppStore|iPhone.Build.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.AppStore|iPhone.Deploy.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Debug|iPhone.Build.0 = Debug|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Debug|iPhone.Deploy.0 = Debug|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Release|Any CPU.Build.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Release|Any CPU.Deploy.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Release|iPhone.ActiveCfg = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Release|iPhone.Build.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Release|iPhone.Deploy.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{C5BC9521-E9B9-44E3-A505-256080B78234}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.AppStore|iPhone.Build.0 = AppStore|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Debug|Any CPU.ActiveCfg = Debug|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Debug|iPhone.ActiveCfg = Debug|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Debug|iPhone.Build.0 = Debug|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Release|Any CPU.ActiveCfg = Release|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Release|iPhone.ActiveCfg = Release|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Release|iPhone.Build.0 = Release|iPhone
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{7AB8FBA6-4F0B-409F-B891-104BA3554470}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738} = {21BCEE36-ACC1-40B6-99F8-C55B1EFB24AC}
{03FE6BCA-AA3B-4689-A829-DB87D51A149E} = {21BCEE36-ACC1-40B6-99F8-C55B1EFB24AC}
{D72B487F-AA32-45B3-92B1-C36BC5659CBF} = {EB8CE116-C94E-4674-82D7-7A2978B32A17}
{C5BC9521-E9B9-44E3-A505-256080B78234} = {EB8CE116-C94E-4674-82D7-7A2978B32A17}
{7AB8FBA6-4F0B-409F-B891-104BA3554470} = {21BCEE36-ACC1-40B6-99F8-C55B1EFB24AC}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
$0.DotNetNamingPolicy = $1
$1.DirectoryNamespaceAssociation = None
$1.ResourceNamePolicy = FileFormatDefault
$0.StandardHeader = $2
$2.Text =
$2.IncludeInNewFiles = True
$0.NameConventionPolicy = $3
$3.Rules = $4
$4.NamingRule = $24
$5.Name = Type Parameters
$5.AffectedEntity = TypeParameter
$5.VisibilityMask = VisibilityMask
$5.NamingStyle = PascalCase
$5.IncludeInstanceMembers = True
$5.IncludeStaticEntities = True
$5.RequiredPrefixes = $27
$27.String = T
$5.RequiredSuffixes = $28
$28.String = Exception
$6.Name = Types
$6.AffectedEntity = Class, Struct, Enum, Delegate
$6.VisibilityMask = Public
$6.NamingStyle = PascalCase
$6.IncludeInstanceMembers = True
$6.IncludeStaticEntities = True
$7.Name = Interfaces
$7.RequiredPrefixes = $8
$8.String = I
$7.AffectedEntity = Interface
$7.VisibilityMask = Public
$7.NamingStyle = PascalCase
$7.IncludeInstanceMembers = True
$7.IncludeStaticEntities = True
$9.Name = Attributes
$9.RequiredSuffixes = $10
$10.String = Attribute
$9.AffectedEntity = CustomAttributes
$9.VisibilityMask = Public
$9.NamingStyle = PascalCase
$9.IncludeInstanceMembers = True
$9.IncludeStaticEntities = True
$11.Name = Event Arguments
$11.RequiredSuffixes = $12
$12.String = EventArgs
$11.AffectedEntity = CustomEventArgs
$11.VisibilityMask = Public
$11.NamingStyle = PascalCase
$11.IncludeInstanceMembers = True
$11.IncludeStaticEntities = True
$13.Name = Exceptions
$13.RequiredSuffixes = $14
$14.String = Exception
$13.AffectedEntity = CustomExceptions
$13.VisibilityMask = VisibilityMask
$13.NamingStyle = PascalCase
$13.IncludeInstanceMembers = True
$13.IncludeStaticEntities = True
$15.Name = Methods
$15.AffectedEntity = Methods
$15.VisibilityMask = Protected, Public
$15.NamingStyle = PascalCase
$15.IncludeInstanceMembers = True
$15.IncludeStaticEntities = True
$16.Name = Static Readonly Fields
$16.AffectedEntity = ReadonlyField
$16.VisibilityMask = Protected, Public
$16.NamingStyle = PascalCase
$16.IncludeInstanceMembers = False
$16.IncludeStaticEntities = True
$17.Name = Fields
$17.AffectedEntity = Field
$17.VisibilityMask = Protected, Public
$17.NamingStyle = PascalCase
$17.IncludeInstanceMembers = True
$17.IncludeStaticEntities = True
$18.Name = ReadOnly Fields
$18.AffectedEntity = ReadonlyField
$18.VisibilityMask = Protected, Public
$18.NamingStyle = PascalCase
$18.IncludeInstanceMembers = True
$18.IncludeStaticEntities = False
$19.Name = Constant Fields
$19.AffectedEntity = ConstantField
$19.VisibilityMask = Protected, Public
$19.NamingStyle = PascalCase
$19.IncludeInstanceMembers = True
$19.IncludeStaticEntities = True
$20.Name = Properties
$20.AffectedEntity = Property
$20.VisibilityMask = Protected, Public
$20.NamingStyle = PascalCase
$20.IncludeInstanceMembers = True
$20.IncludeStaticEntities = True
$21.Name = Events
$21.AffectedEntity = Event
$21.VisibilityMask = Protected, Public
$21.NamingStyle = PascalCase
$21.IncludeInstanceMembers = True
$21.IncludeStaticEntities = True
$22.Name = Enum Members
$22.AffectedEntity = EnumMember
$22.VisibilityMask = VisibilityMask
$22.NamingStyle = PascalCase
$22.IncludeInstanceMembers = True
$22.IncludeStaticEntities = True
$23.Name = Parameters
$23.AffectedEntity = Parameter
$23.VisibilityMask = VisibilityMask
$23.NamingStyle = CamelCase
$23.IncludeInstanceMembers = True
$23.IncludeStaticEntities = True
$24.Name = Type Parameters
$24.RequiredPrefixes = $25
$25.String = T
$24.AffectedEntity = TypeParameter
$24.VisibilityMask = VisibilityMask
$24.NamingStyle = PascalCase
$24.IncludeInstanceMembers = True
$24.IncludeStaticEntities = True
$0.VersionControlPolicy = $26
$26.inheritsSet = Mono
version = 0.8
EndGlobalSection
EndGlobal
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2016 Sebastian Schmidt
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:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
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.
================================================
FILE: README.md
================================================
# BottomNavigationBarXF
A Bottom Navigation Bar implementation for Xamarin Forms.
It's using the [Bottom Navigation Bar](https://github.com/pocheshire/BottomNavigationBar) project to render the Navigation Bar on Android. It will render a standard TabbedPage on iOS.
# Introduction
[](https://www.youtube.com/watch?v=Cp_2F621Az0)
Thanks to Houssem Dellai for this great introductionary video.
# NuGet
Find it [here](https://www.nuget.org/packages/ThriveGmbH.BottomNavigationBar.XF/).
## License
The MIT License (MIT)
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:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
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.
================================================
FILE: example/BottomBarXFExample/App.xaml
================================================
================================================
FILE: example/BottomBarXFExample/App.xaml.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using BottomBar.XamarinForms;
using Xamarin.Forms;
namespace BottomBarXFExample
{
public partial class App : Application
{
public App ()
{
InitializeComponent ();
BottomBarPage bottomBarPage = new BottomBarPage ();
//bottomBarPage.BarBackgroundColor = Color.Pink;
// You can only define the color for the active icon if you set the Bottombar to fixed mode
// So if you want to try this, just uncomment the next two lines
//bottomBarPage.BarTextColor = Color.Blue; // Setting Color of selected Text and Icon
//bottomBarPage.FixedMode = true;
// Whith BarTheme you can select between light and dark theming when using FixedMode
// When using DarkTheme you can set the Background Color by adding a colors.xml to you Android.Resources.Values
// with content
//
// #ffffff
// < color name = "bb_darkBackgroundColor" >#000000
//
// by setting "white" you can select the color of the non selected items and texts in dark theme
// The Difference between DarkThemeWithAlpha and DarkThemeWithoutAlpha is that WithAlpha will draw not selected items with halfe the
// intensity instaed of solid "white" value
//
// Uncomment next line to use Dark Theme
// bottomBarPage.BarTheme = BottomBarPage.BarThemeTypes.DarkWithAlpha;
string[] tabTitles = { "Favorites", "Friends", "Nearby", "Recents", "Restaurants" };
string [] tabColors = { null, "#5D4037", "#7B1FA2", "#FF5252", "#FF9800" };
int[] tabBadgeCounts = {0, 1, 5, 3, 4};
string[] tabBadgeColors = {"#000000", "#FF0000", "#000000", "#000000", "#000000"};
for (int i = 0; i < tabTitles.Length; ++i) {
string title = tabTitles [i];
string tabColor = tabColors [i];
int tabBadgeCount = tabBadgeCounts[i];
string tabBadgeColor = tabBadgeColors[i];
FileImageSource icon = (FileImageSource) FileImageSource.FromFile (string.Format ("ic_{0}.png", title.ToLowerInvariant ()));
// create tab page
var tabPage = new TabPage () {
Title = title,
Icon = icon
};
// set tab color
if (tabColor != null) {
BottomBarPageExtensions.SetTabColor(tabPage, Color.FromHex(tabColor));
}
// Set badges
BottomBarPageExtensions.SetBadgeCount(tabPage, tabBadgeCount);
BottomBarPageExtensions.SetBadgeColor(tabPage, Color.FromHex(tabBadgeColor));
// set label based on title
tabPage.UpdateLabel ();
// add tab pag to tab control
bottomBarPage.Children.Add (tabPage);
}
MainPage = bottomBarPage;
}
protected override void OnStart ()
{
// Handle when your app starts
}
protected override void OnSleep ()
{
// Handle when your app sleeps
}
protected override void OnResume ()
{
// Handle when your app resumes
}
}
}
================================================
FILE: example/BottomBarXFExample/BottomBarXFExample.csproj
================================================
DebugAnyCPU{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}LibraryBottomBarXFExampleBottomBarXFExamplev4.5Profile780.8truefullfalsebin\DebugDEBUG; ANDROIDprompt4falsetruebin\Releaseprompt4falseMSBuild:UpdateDesignTimeXamlMSBuild:UpdateDesignTimeXamlApp.xamlTabPage.xaml{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}BottomBar.XamarinForms..\..\packages\Xamarin.Forms.2.3.2.127\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Core.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Platform.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Xaml.dll
================================================
FILE: example/BottomBarXFExample/Properties/AssemblyInfo.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Reflection;
using System.Runtime.CompilerServices;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle ("BottomBarXFExample")]
[assembly: AssemblyDescription ("Bottom Bar for Xamarin Forms - Example Xamarin Forms project")]
[assembly: AssemblyConfiguration ("")]
[assembly: AssemblyCompany ("")]
[assembly: AssemblyProduct ("")]
[assembly: AssemblyCopyright ("sebs")]
[assembly: AssemblyTrademark ("")]
[assembly: AssemblyCulture ("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion ("1.0.*")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]
================================================
FILE: example/BottomBarXFExample/TabPage.xaml
================================================
================================================
FILE: example/BottomBarXFExample/TabPage.xaml.cs
================================================
using System;
using System.Collections.Generic;
using Xamarin.Forms;
namespace BottomBarXFExample
{
public partial class TabPage : ContentPage
{
public TabPage ()
{
InitializeComponent ();
}
public void UpdateLabel ()
{
Label.Text = string.Format (Label.Text, Title);
}
}
}
================================================
FILE: example/BottomBarXFExample/packages.config
================================================
================================================
FILE: example/BottomBarXFExample.Droid/Assets/AboutAssets.txt
================================================
Any raw assets you want to be deployed with your application can be placed in
this directory (and child directories) and given a Build Action of "AndroidAsset".
These files will be deployed with your package and will be accessible using Android's
AssetManager, like this:
public class ReadAsset : Activity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
InputStream input = Assets.Open ("my_asset.txt");
}
}
Additionally, some Android functions will automatically load asset files:
Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
================================================
FILE: example/BottomBarXFExample.Droid/BottomBarXFExample.Droid.csproj
================================================
23.0.3DebugAnyCPU{03FE6BCA-AA3B-4689-A829-DB87D51A149E}{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}LibraryBottomBarXFExample.DroidBottomBarXFExample.Droidv7.1TrueResources\Resource.designer.csResourceProperties\AndroidManifest.xmlResourcesAssetstrue0.8Nonetruefullfalsebin\DebugDEBUG;prompt4falsetruebin\Releaseprompt4falsefalsearmeabi-v7a;x86;armeabi;arm64-v8a;x86_64..\..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Vector.Drawable.dll..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll..\..\packages\Xamarin.Android.Support.v7.AppCompat.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll..\..\packages\Xamarin.Android.Support.v7.RecyclerView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.RecyclerView.dll..\..\packages\Xamarin.Android.Support.Design.23.3.0\lib\MonoAndroid43\Xamarin.Android.Support.Design.dll..\..\packages\Xamarin.Android.Support.v7.CardView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.CardView.dll..\..\packages\Xamarin.Android.Support.v7.MediaRouter.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.MediaRouter.dll..\..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll..\..\packages\BottomNavigationBar.1.4.0.2\lib\MonoAndroid403\BottomNavigationBar.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\FormsViewGroup.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Core.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Platform.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll{821A7B88-A9CD-4CCA-B32B-CEE8DCF49738}BottomBarXFExample{96746A3E-074D-40C6-B2E2-CA90313012C6}BottomBar.Droid{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}BottomBar.XamarinForms
================================================
FILE: example/BottomBarXFExample.Droid/MainActivity.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
namespace BottomBarXFExample.Droid
{
[Activity (Label = "BottomBarXFExample.Droid", Icon = "@drawable/icon", Theme = "@style/MyTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate (Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate (bundle);
global::Xamarin.Forms.Forms.Init (this, bundle);
LoadApplication (new App ());
}
}
}
================================================
FILE: example/BottomBarXFExample.Droid/Properties/AndroidManifest.xml
================================================
================================================
FILE: example/BottomBarXFExample.Droid/Properties/AssemblyInfo.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Reflection;
using System.Runtime.CompilerServices;
using Android.App;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle ("BottomBarXFExample.Droid")]
[assembly: AssemblyDescription ("Bottom Bar for Xamarin Forms - Example Android App")]
[assembly: AssemblyConfiguration ("")]
[assembly: AssemblyCompany ("")]
[assembly: AssemblyProduct ("")]
[assembly: AssemblyCopyright ("sebs")]
[assembly: AssemblyTrademark ("")]
[assembly: AssemblyCulture ("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion ("1.0.0")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]
================================================
FILE: example/BottomBarXFExample.Droid/Resources/AboutResources.txt
================================================
Images, layout descriptions, binary blobs and string dictionaries can be included
in your application as resource files. Various Android APIs are designed to
operate on the resource IDs instead of dealing with images, strings or binary blobs
directly.
For example, a sample Android app that contains a user interface layout (main.axml),
an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
would keep its resources in the "Resources" directory of the application:
Resources/
drawable/
icon.png
layout/
main.axml
values/
strings.xml
In order to get the build system to recognize Android resources, set the build action to
"AndroidResource". The native Android APIs do not operate directly with filenames, but
instead operate on resource IDs. When you compile an Android application that uses resources,
the build system will package the resources for distribution and generate a class called "R"
(this is an Android convention) that contains the tokens for each one of the resources
included. For example, for the above Resources layout, this is what the R class would expose:
public class R {
public class drawable {
public const int icon = 0x123;
}
public class layout {
public const int main = 0x456;
}
public class strings {
public const int first_string = 0xabc;
public const int second_string = 0xbcd;
}
}
You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
to reference the layout/main.axml file, or R.strings.first_string to reference the first
string in the dictionary file values/strings.xml.
================================================
FILE: example/BottomBarXFExample.Droid/Resources/layout/Tabbar.axml
================================================
================================================
FILE: example/BottomBarXFExample.Droid/Resources/layout/Toolbar.axml
================================================
================================================
FILE: example/BottomBarXFExample.Droid/Resources/values/colors.xml
================================================
#ffffff#000000
================================================
FILE: example/BottomBarXFExample.Droid/Resources/values/styles.xml
================================================
================================================
FILE: example/BottomBarXFExample.Droid/packages.config
================================================
================================================
FILE: example/BottomBarXFExample.iOS/AppDelegate.cs
================================================
using Foundation;
using UIKit;
namespace BottomBarXFExample.iOS
{
// The UIApplicationDelegate for the application. This class is responsible for launching the
// User Interface of the application, as well as listening (and optionally responding) to application events from iOS.
[Register("AppDelegate")]
public class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
// class-level declarations
public override UIWindow Window
{
get;
set;
}
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
global::Xamarin.Forms.Forms.Init();
UINavigationBar.Appearance.BarTintColor = UIColor.White;
UINavigationBar.Appearance.TitleTextAttributes = new UIStringAttributes() { ForegroundColor = UIColor.Black };
var app = new App();
LoadApplication(app);
return base.FinishedLaunching(application, launchOptions);
}
public override void OnResignActivation(UIApplication application)
{
// Invoked when the application is about to move from active to inactive state.
// This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message)
// or when the user quits the application and it begins the transition to the background state.
// Games should use this method to pause the game.
}
public override void DidEnterBackground(UIApplication application)
{
// Use this method to release shared resources, save user data, invalidate timers and store the application state.
// If your application supports background exection this method is called instead of WillTerminate when the user quits.
}
public override void WillEnterForeground(UIApplication application)
{
// Called as part of the transiton from background to active state.
// Here you can undo many of the changes made on entering the background.
}
public override void OnActivated(UIApplication application)
{
// Restart any tasks that were paused (or not yet started) while the application was inactive.
// If the application was previously in the background, optionally refresh the user interface.
}
public override void WillTerminate(UIApplication application)
{
// Called when the application is about to terminate. Save data, if needed. See also DidEnterBackground.
}
}
}
================================================
FILE: example/BottomBarXFExample.iOS/BottomBarXFExample.iOS.csproj
================================================
DebugiPhoneSimulator{7AB8FBA6-4F0B-409F-B891-104BA3554470}{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}ExeBottomBarXFExample.iOSResourcesBottomBarXFExample.iOStruefullfalsebin\iPhoneSimulator\DebugDEBUGprompt4falsex86_64Nonetruenonetruebin\iPhoneSimulator\Releaseprompt4Nonex86_64falsetruefullfalsebin\iPhone\DebugDEBUGprompt4falseARMv7, ARM64Entitlements.plistiPhone Developertruenonetruebin\iPhone\Releaseprompt4Entitlements.plistARMv7, ARM64falseiPhone DevelopernoneTruebin\iPhone\Ad-Hocprompt4FalseARMv7, ARM64Entitlements.plistTrueAutomatic:AdHociPhone DistributionnoneTruebin\iPhone\AppStoreprompt4FalseARMv7, ARM64Entitlements.plistAutomatic:AppStoreiPhone DistributionDesigner..\packages\Xamarin.Forms.2.3.2.127\lib\Xamarin.iOS10\Xamarin.Forms.Core.dllTrue..\packages\Xamarin.Forms.2.3.2.127\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dllTrue..\packages\Xamarin.Forms.2.3.2.127\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dllTrue..\packages\Xamarin.Forms.2.3.2.127\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dllTrue{bb1d801d-5ec3-471d-b9ea-98c48d785baa}BottomBar.XamarinForms{821a7b88-a9cd-4cca-b32b-cee8dcf49738}BottomBarXFExampleThis project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
================================================
FILE: example/BottomBarXFExample.iOS/Entitlements.plist
================================================
================================================
FILE: example/BottomBarXFExample.iOS/Info.plist
================================================
CFBundleDisplayNameBottomBarXFExample.iOSCFBundleShortVersionString1.0CFBundleVersion1.0LSRequiresIPhoneOSMinimumOSVersionUIDeviceFamily1UIRequiredDeviceCapabilitiesarmv7UISupportedInterfaceOrientationsUIInterfaceOrientationPortraitUIInterfaceOrientationLandscapeLeftUIInterfaceOrientationLandscapeRightUILaunchStoryboardNameCFBundleIdentifiercom.pocheshire.BottomBarXFExample.iOS
================================================
FILE: example/BottomBarXFExample.iOS/Main.cs
================================================
using UIKit;
namespace BottomBarXFExample.iOS
{
public class Application
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, "AppDelegate");
}
}
}
================================================
FILE: example/BottomBarXFExample.iOS/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("BottomBarXFExample.iOS")]
[assembly: AssemblyDescription("Bottom Bar for Xamarin Forms - Example iOS App")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BottomBarXFExample.iOS")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("7ab8fba6-4f0b-409f-b891-104ba3554470")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
================================================
FILE: example/BottomBarXFExample.iOS/Resources/LaunchScreen.xib
================================================
================================================
FILE: example/BottomBarXFExample.iOS/packages.config
================================================
================================================
FILE: example-xaml/BottomBarXFExampleXaml/App.xaml
================================================
================================================
FILE: example-xaml/BottomBarXFExampleXaml/App.xaml.cs
================================================
using Xamarin.Forms;
namespace BottomBarXFExampleXaml
{
public partial class App : Application
{
public App ()
{
InitializeComponent ();
MainPage = new BarPage();
}
protected override void OnStart ()
{
// Handle when your app starts
}
protected override void OnSleep ()
{
// Handle when your app sleeps
}
protected override void OnResume ()
{
// Handle when your app resumes
}
}
}
================================================
FILE: example-xaml/BottomBarXFExampleXaml/BarPage.xaml
================================================
================================================
FILE: example-xaml/BottomBarXFExampleXaml/BarPage.xaml.cs
================================================
namespace BottomBarXFExampleXaml
{
public partial class BarPage
{
public BarPage()
{
InitializeComponent();
}
}
}
================================================
FILE: example-xaml/BottomBarXFExampleXaml/BottomBarXFExampleXaml.csproj
================================================
DebugAnyCPU{D72B487F-AA32-45B3-92B1-C36BC5659CBF}{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}LibraryBottomBarXFExampleXamlBottomBarXFExampleXamlv4.5Profile780.8truefullfalsebin\DebugDEBUG; ANDROIDprompt4falsetruebin\Releaseprompt4falseMSBuild:UpdateDesignTimeXamlMSBuild:UpdateDesignTimeXamlApp.xamlBarPage.xamlTabPage.xaml{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}BottomBar.XamarinForms..\..\packages\Xamarin.Forms.2.3.2.127\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Core.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Platform.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Xaml.dllMSBuild:UpdateDesignTimeXamlDesigner
================================================
FILE: example-xaml/BottomBarXFExampleXaml/Properties/AssemblyInfo.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Reflection;
using System.Runtime.CompilerServices;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle ("BottomBarXFExampleXaml")]
[assembly: AssemblyDescription ("Bottom Bar for Xamarin Forms - Example Xamarin Forms project")]
[assembly: AssemblyConfiguration ("")]
[assembly: AssemblyCompany ("")]
[assembly: AssemblyProduct ("")]
[assembly: AssemblyCopyright ("sebs")]
[assembly: AssemblyTrademark ("")]
[assembly: AssemblyCulture ("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion ("1.0.*")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]
================================================
FILE: example-xaml/BottomBarXFExampleXaml/TabPage.xaml
================================================
================================================
FILE: example-xaml/BottomBarXFExampleXaml/TabPage.xaml.cs
================================================
namespace BottomBarXFExampleXaml
{
public partial class TabPage
{
public TabPage ()
{
InitializeComponent ();
this.Appearing += (sender, e) => Label.Text = string.Format(Label.Text, Title);
}
}
}
================================================
FILE: example-xaml/BottomBarXFExampleXaml/packages.config
================================================
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/Assets/AboutAssets.txt
================================================
Any raw assets you want to be deployed with your application can be placed in
this directory (and child directories) and given a Build Action of "AndroidAsset".
These files will be deployed with your package and will be accessible using Android's
AssetManager, like this:
public class ReadAsset : Activity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
InputStream input = Assets.Open ("my_asset.txt");
}
}
Additionally, some Android functions will automatically load asset files:
Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/BottomBarXFExampleXaml.Droid.csproj
================================================
23.0.3DebugAnyCPU{C5BC9521-E9B9-44E3-A505-256080B78234}{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}LibraryBottomBarXFExampleXaml.DroidBottomBarXFExampleXaml.Droidv7.1TrueResources\Resource.designer.csResourceProperties\AndroidManifest.xmlResourcesAssetstrue0.8Nonetruefullfalsebin\DebugDEBUG;prompt4falsetruebin\Releaseprompt4falsefalsearmeabi-v7a;x86;armeabi;arm64-v8a;x86_64..\..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Vector.Drawable.dll..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll..\..\packages\Xamarin.Android.Support.v7.AppCompat.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll..\..\packages\Xamarin.Android.Support.v7.RecyclerView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.RecyclerView.dll..\..\packages\Xamarin.Android.Support.Design.23.3.0\lib\MonoAndroid43\Xamarin.Android.Support.Design.dll..\..\packages\Xamarin.Android.Support.v7.CardView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.CardView.dll..\..\packages\Xamarin.Android.Support.v7.MediaRouter.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.MediaRouter.dll..\..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll..\..\packages\BottomNavigationBar.1.4.0.2\lib\MonoAndroid403\BottomNavigationBar.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\FormsViewGroup.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Core.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Platform.dll..\..\packages\Xamarin.Forms.2.3.2.127\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll{96746A3E-074D-40C6-B2E2-CA90313012C6}BottomBar.Droid{BB1D801D-5EC3-471D-B9EA-98C48D785BAA}BottomBar.XamarinForms{d72b487f-aa32-45b3-92b1-c36bc5659cbf}BottomBarXFExampleXaml
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/MainActivity.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
namespace BottomBarXFExampleXaml.Droid
{
[Activity (Label = "BottomBarXFExampleXaml.Droid", Icon = "@drawable/icon", Theme = "@style/MyTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate (Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate (bundle);
global::Xamarin.Forms.Forms.Init (this, bundle);
LoadApplication (new App ());
}
}
}
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/Properties/AndroidManifest.xml
================================================
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/Properties/AssemblyInfo.cs
================================================
/*
* BottomNavigationBar for Xamarin Forms
* Copyright (c) 2016 Thrive GmbH and others (http://github.com/thrive-now).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Reflection;
using System.Runtime.CompilerServices;
using Android.App;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle ("BottomBarXFExampleXaml.Droid")]
[assembly: AssemblyDescription ("Bottom Bar for Xamarin Forms - Example Android App")]
[assembly: AssemblyConfiguration ("")]
[assembly: AssemblyCompany ("")]
[assembly: AssemblyProduct ("")]
[assembly: AssemblyCopyright ("sebs")]
[assembly: AssemblyTrademark ("")]
[assembly: AssemblyCulture ("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion ("1.0.0")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/Resources/AboutResources.txt
================================================
Images, layout descriptions, binary blobs and string dictionaries can be included
in your application as resource files. Various Android APIs are designed to
operate on the resource IDs instead of dealing with images, strings or binary blobs
directly.
For example, a sample Android app that contains a user interface layout (main.axml),
an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
would keep its resources in the "Resources" directory of the application:
Resources/
drawable/
icon.png
layout/
main.axml
values/
strings.xml
In order to get the build system to recognize Android resources, set the build action to
"AndroidResource". The native Android APIs do not operate directly with filenames, but
instead operate on resource IDs. When you compile an Android application that uses resources,
the build system will package the resources for distribution and generate a class called "R"
(this is an Android convention) that contains the tokens for each one of the resources
included. For example, for the above Resources layout, this is what the R class would expose:
public class R {
public class drawable {
public const int icon = 0x123;
}
public class layout {
public const int main = 0x456;
}
public class strings {
public const int first_string = 0xabc;
public const int second_string = 0xbcd;
}
}
You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
to reference the layout/main.axml file, or R.strings.first_string to reference the first
string in the dictionary file values/strings.xml.
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/Resources/layout/Tabbar.axml
================================================
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/Resources/layout/Toolbar.axml
================================================
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/Resources/values/colors.xml
================================================
#ffffff#000000
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/Resources/values/styles.xml
================================================
================================================
FILE: example-xaml/BottomBarXFExampleXaml.Droid/packages.config
================================================