Xamarin Forms bindable tab badges for iOS, Android, UWP, MacOS and WPF. The plugin creates a custom renderer (for each platform) and a custom attached property for adding tab bar badges which can be bound in XF shared code.
Feature / Availability | Xamarin.Android (1) | Xamarin.iOS | UWP (2) | MacOS (3) | WPF (4) |
---|---|---|---|---|---|
Bindable Badge Text | ✓ | ✓ (>=8.0) | ✓ | ✓ | ✓ |
Bindable Badge Color | ✓ | ✓ (>= 10.0) | ✓ | ✓ | ✓ |
Bindable Badge Text Color | ✓ | ✓ (>= 10.0) | ✓ | ✓ | ✓ |
Bindable Badge Font | ✓* | ✓ *(>= 10.0) | ✓ | ✓ | ✓ |
Bindable Badge Postion | ✓ | ✕ | ✓ | ✓ | ✓ |
Bindable Badge Margin | ✓ | ✕ | ✓ | ✓ | ✓ |
Dynamic tab add/removal | ✓ | No overflow | ✓ | ✓ | ✓ |
*(1) Min Android API level 15, bottom placement also supported starting with v2.1.0
*(2) Min UWP version: Win 10 Fall Creators Update (XF.3 has a .netstandard 2 requirement).
*(3) MacOS version: -
*(4) WPF version: -
**Font restrictions: able to bind font attributes and family but not size
// stable
Install-Package Plugin.Badge
// or pre-release
Install-Package Plugin.Badge -Pre
You have to register the custom renderer. I usually put this in the AssemblyInfo.cs file of my Platform specific project (iOS, Android, UWP, MacOS, WPF) csproj.
[assembly: ExportRenderer(typeof(TabbedPage), typeof(BadgedTabbedPageRenderer))]
Caution: If you are using the NON AppCompat MainActivity (i.e. you Main activity inherits from FormsApplicationActivity) please register the 'Legacy' renderer
[assembly: ExportRenderer(typeof(TabbedPage), typeof(LegacyBadgedTabbedRenderer))]
If you are using a custom renderer for TabbedPage please change it to inherit from BadgedTabbedPageRenderer
and you are all set. Of course dont forget to register your own renderer.
As you already know when you enable linkling for your application the linker might remove some of the methods/types/properties/events used by third party libraries. This is why it's necessary to update your LinkerPleaseInclude.cs
. Check this blogpost for more linker info.
public void Include(UITabBarItem item)
{
item.BadgeColor = UIColor.Red;
item.BadgeValue = "badge";
}
For each child page of the TabbedPage just bind the custom attached property
[TabBadge.BadgeText
(XAML) or TabBadge.BadgeTextPropery
(CSharp)]
The important line here is binding the attached property:
plugin:TabBadge.BadgeText="{Binding Count}"
Example tabbed page with badged children:
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:plugin="clr-namespace:Plugin.Badge.Abstractions;assembly=Plugin.Badge.Abstractions"
x:Class="Plugin.Badge.Sample.TabXaml">
<TabbedPage.Children>
<ContentPage Title="Tab1"
Icon="icontab1.png"
plugin:TabBadge.BadgeText="{Binding Count}">
<StackLayout>...</StackLayout>
</ContentPage>
...
</TabbedPage.Children>
</TabbedPage>
var tab1 = new ContentPage //assume this is a child page of your Tab
{
Title = "Tab1",
Content = tab1Layout
};
tab1.SetBinding(TabBadge.BadgeTextProperty, new Binding("Count"));
Very similar to BadgeText
just use [TabBadge.BadgeColor
(XAML) or TabBadge.BadgeColorPropery
(CSharp)].
Very similar to BadgeColor
just use [TabBadge.BadgeTextColor
(XAML) or TabBadge.BadgeTextColorPropery
(CSharp)].
Very similar to BadgeColor
just use [TabBadge.BadgeFont
(XAML) or TabBadge.BadgeFontPropery
(CSharp)].
ToDo:
Very similar to BadgeColor
just use [TabBadge.BadgePosition
(XAML) or TabBadge.BadgePositionPropery
(CSharp)].
TopLeft | BottomLeft | BottomRight | Center | TopCenter | BottomCenter | LeftCenter | RightCenter |
---|---|---|---|---|---|---|---|
If the value of the BadgeText
is set to null or empty string the badge is hidden. To show it again set a non null or empty value
As of v2.2.0 the package also contains a XF Badge view that is based on a XF Frame View and can be added to any layout and bound using the usual approach. The generic badge view can also be added to custom NavigationPage.TitleView layouts.
Checkout the Sample-App for more.