Xamarin

Talk with Rui Marinho XLabs Founder and Xamarin.Forms Developer

Last weekend I was lucky enough to attend and speak at the Xamarin Dev Days in Singapore. I think Dev Days Singapore is the biggest Dev Days so far with 400 registrations and 250 that attended. It was even more awesome for myself as I got to catch up with some friends in the Xamarin world including Rui Marinho.

In this video I talk with Rui Marinho the founder of XLabs and now a developer on the Xamarin.Forms team. We delve into some important topics, we discuss how he got into Xamarin, announce that XLabs is Dead, talk about open source and a little about the future of Xamarin.Forms.

 

Be more awesome with MFractor for Xamarin Studio

In this video I interview Matthew Robbins the creator of MFractor a Xamarin Studio Plugin. If you’re not using MFractor your really missing out, it’s got some beautiful features which save you truckloads of time when building apps with Xamarin Studio.

If you’ve ever wanted a ReSharper for Xamarin Studio this is it. It’s got static analysis, code generation and advanced navigation features. It’s here right now and will only get more awesome into the future.

You can find out more about MFractor here: www.fractor.com and find Matthew on twitter.com/matthewrdev

 

Announcing FreshMvvm 2.1 and 2.2

Your favourite Mvvm Framework for Xamarin.Forms just keeps getting better. At XAM Consulting we use FreshMvvm in all of our serious production applications, the fact that we use FreshMvvm so intensely is the reason that FreshMvvm is easy to use, robust and flexible.

There’s been two releases of FreshMvvm since I last updated, Version 2.1 and Version 2.2.

Release 2.2.0

Better debug messages displayed

In previous versions of FreshMvvm construction errors of pages were in a few levels of inner exceptions, so if your xaml had a little error you had to dig into the inner exceptions. It was not an issue for experienced users of FreshMvvm but for people new to the Framework it was a bit hard to figure out the actual issue. Now exceptions will be bubbled up developers won’t need to look into inner exceptions.

Ability to remove a page from Navigation

In some cases you might want to remove a page from the Navigation stack. This works in the case you’ve Pushed a few pages but want to remove one of the pages from the stack before you return,  for example you’ve pushed to Page1 -> Page2 -> Page3, but you essentially you don’t want Page2 to be part of the stack anymore. In this case you can call the remove method.

CoreMethods.RemoveFromNavigation<Page2ViewModel>();

Add ability to SwitchSelectedRoot page in Tabs and MasterDetail

This is another special finite feature of FreshMvvm, in which you can switch the currently selected page of the main tabbed page or the master detail page.

//switch the selected tab to the HomePageModel
CoreMethods.SwitchSelectedTab<HomePageModel>();

//switch selected master to the HomePageModel
CoreMethods.SwitchSelectedMaster<HomePageModel>();

//switch selected to the HomePageModel
CoreMethods.SwitchSelectedRootPageModel<HomePageModel>();

 

Release 2.1.0

Adds ability to control PageModel mapping via PageModelMapper

You now have the ability to control the convention of mapping ViewModel to pages. You do this by using the IFreshPageModelMapper.

public interface IFreshPageModelMapper
{
    string GetPageTypeName(Type pageModelType);
}

Currently the PageModel mapper is defaulted to  the FreshPageModelMapper.

public static class FreshPageModelResolver
{
    public static IFreshPageModelMapper PageModelMapper { get; set; } = new FreshPageModelMapper();
    ...

The current behaviour is to map PageModel or ViewModel to Page.

public class FreshPageModelMapper : IFreshPageModelMapper
{
    public string GetPageTypeName(Type pageModelType)
    {
        return pageModelType.AssemblyQualifiedName
            .Replace ("PageModel", "Page")
            .Replace ("ViewModel", "Page");
    }
}

It’s easy to implement your own custom mapper and then set the PageModelMapper.

FreshPageModelResolver.PageModelMapper = MyPageModelMapper();

Adds ability to navigate without animation

You can now push and pop PageModel without animations.

Better cleanup of objects

We clean up after ourselves, even better now. 🙂

IOC now has unregister feature

You can now unregister a class out of the IOC container.

Add First Only Tabbed Navigation Container

FreshMvvm has always had a built in tabbed navigation container, the behaviour of this navigation is to keep the tabs always present but this is not what you always want. In some case you want the tabs to disappear when you push to a page, so we created the FreshFONavigationContainer. The FO stands for First Only and it means this tab page will only appear on the first page of the app.

FreshMvvm in Production

It makes us happy to see that so many others are also delivering great apps using FreshMvvm. I was recently informed that the Fraedom Expense app was built with FreshMvvm. Great work.

As always the latest version of FreshMvvm is up in nuget right now.

Thanks

 

Announcing FreshMvvm 2.0

Today we’ve published up to nuget FreshMvvm 2.0 with some very anticipated new features.

IOC Container Lifetime Registration Options

We now support a fluent API for setting the object lifetime of object inside the IOC Container.

// By default we register concrete types as 
// multi-instance, and interfaces as singletons
FreshIOC.Container.Register<MyConcreteType>(); // Multi-instance
FreshIOC.Container.Register<IMyInterface, MyConcreteType>(); // Singleton 

// Fluent API allows us to change that behaviour
FreshIOC.Container.Register<MyConcreteType>().AsSingleton(); // Singleton
FreshIOC.Container.Register<IMyInterface, MyConcreteType>().AsMultiInstance(); // Multi-instance

As you can see below the IFreshIOC interface methods return the IRegisterOptions interface.

public interface IFreshIOC
{
    object Resolve(Type resolveType);
    IRegisterOptions Register<RegisterType>(RegisterType instance) where RegisterType : class;
    IRegisterOptions Register<RegisterType>(RegisterType instance, string name) where RegisterType : class;
    ResolveType Resolve<ResolveType>() where ResolveType : class;
    ResolveType Resolve<ResolveType>(string name) where ResolveType : class;
    IRegisterOptions Register<RegisterType, RegisterImplementation> ()
        where RegisterType : class
        where RegisterImplementation : class, RegisterType;
}

The interface that’s returned from the register methods is IRegisterOptions.

public interface IRegisterOptions
{
    IRegisterOptions AsSingleton();
    IRegisterOptions AsMultiInstance();
    IRegisterOptions WithWeakReference();
    IRegisterOptions WithStrongReference();
    IRegisterOptions UsingConstructor<RegisterType>(Expression<Func<RegisterType>> constructor);
}

Switching out NavigationStacks on the Xamarin.Forms MainPage

There’s some cases in Xamarin.Forms you might want to run multiple navigation stacks. A good example of this is when you have a navigation stack for the authentication and a stack for the primary area of your application.

To begin with we can setup some names for our navigation containers.

public class NavigationContainerNames
{
    public const string AuthenticationContainer = "AuthenticationContainer";
    public const string MainContainer = "MainContainer";
}

Then we can create our two navigation containers and assign to the MainPage.

var loginPage = FreshMvvm.FreshPageModelResolver.ResolvePageModel<LoginViewModel>();
var loginContainer = new FreshNavigationContainer(loginPage, NavigationContainerNames.AuthenticationContainer);

var myPitchListViewContainer = new MainTabbedPage(NavigationContainerNames.MainContainer);

MainPage = loginContainer;

Once we’ve set this up we can now switch out our navigation containers.

CoreMethods.SwitchOutRootNavigation(NavigationContainerNames.MainContainer);

New public methods

CurrentNavigationServiceName and PreviousNavigationServiceName are both public methods, so you can access them if you need to.

Some features (recently released)

Multiple Navigation Services
Custom IOC Containers
WhenAny
Pushing different views
Clean up after page is Popped

Summary

As always this is available on nuget now!

If you have any questions please ask on forums.xamarin.com and send me a email.

You can also find some more docs on the github repo.

Thanks

FreshEssentials for Xamarin.Forms – The must-have nuget for Forms

Ah this is one I’ve been wanting to do for a long time and I’m pretty excited about it. We use it everyday, as it’s really useful.

FreshEssentials for Xamarin.Forms has ONLY the most common elements you need for Xamarin.Forms. It’s contains the elements you need in almost every project and nothing more, things like BindablePicker, SegementedButtons, InverseBooleanConverter, TappedGestureAttached, ListViewItemTappedAttached and not much more. It’s the lightweight essentials.

Why?

Because it’s awesome and nothing else solves this problem yet. For the majority of projects there’s some missing essential pieces to the Xamarin.Forms puzzle, what I wanted to build was a nuget that filled the gaps but ONLY the essential gaps. These are code snippets I’ve been putting in the majority of my Xamarin.Forms projects, the components are stable and used regularly. These codes snippets include a BindablePicker and InverseBooleanConverter, who doesn’t use them in a project. Most people just copy them from project to project, XLabs had the idea to solve this issue but now it’s blow out and is normally too large for most Xamarin.Forms projects. Just to note, I’m a contributor to XLabs and was one one of the first to contributors but with the direction it’s now taken I’m not sure if anyone wants to maintain it, the monolith it is means it’s hard to maintain.

How to use?

nuget all the things…. Primarily you can get FreshEssentials from nuget.

https://www.nuget.org/packages/FreshEssentials/1.0.0

The code can be found on github and there’s also a sample project.

FreshEssentials on github(https://github.com/XAM-Consulting/FreshEssentials)

FreshEssentials sample on github (https://github.com/XAM-Consulting/FreshEssentialsSample)

BindablePicker

Ok so who doesn’t need a BindablePicker in a Xamarin.Forms project?

BindablePicker inherits from Xamarin.Forms.Picker, you can binding data to ItemSource as Items, and also can set which property you want to display via DisplayProperty.

If you want to use it in XAML, you need to include the namespace first.

xmlns:fe="clr-namespace:FreshEssentials;assembly=FreshEssentials"
<fe:BindablePicker ItemsSource="{Binding MyCars}" SelectedItem="{Binding SelectedCar}" DisplayProperty="MakeAndModel" Title="Select..." />

AdvancedFrame (flexible rounded corners)

This is primary used for the SegmentedButtonGroup, it gives you more flexibility on the corner radius in the Frame. AdvancedFrame inherits from Frame, you can set corner type via Corners(There are only four type, left, right, all, none), you can also set CornerRadius and InnerBackground color

<fe:AdvancedFrame Corners="left" CornerRadius="10" InnerBackground="Blue" OutlineColor="Red" >
    <Label Text="Corners is left, CornerRadius is 10, InnerBackground is Blue" TextColor="White"/>
</fe:AdvancedFrame>

SegmentedButtonGroup

This is one that most people ask for in their first project, normally people fail to implement the segmented button in XF and crosss platform. I hope with this control people will be able to use it more often.

SegmentedButtonGroup is like iOS Segmented Controls, you can binding SelectedIndex for it

<fe:SegmentedButtonGroup OnColor="Blue" OffColor="White" SelectedIndex="{Binding SelectIndex, Mode=TwoWay}">
<fe:SegmentedButtonGroup.SegmentedButtons>
  <fe:SegmentedButton Title="Button 1"/>
  <fe:SegmentedButton Title="Button 2"/>
  <fe:SegmentedButton Title="Button 3"/>
</fe:SegmentedButtonGroup.SegmentedButtons>
</fe:SegmentedButtonGroup>

InverseBooleanConverter

Ah the amount of times people have copied this code into their project… not anymore….

<ContentPage.Resources>
    <ResourceDictionary>
         <fe:InverseBooleanConverter x:Key="InverseConverter" />
    </ResourceDictionary>
</ContentPage.Resources>

<Button Text="Click Me" IsVisible="{Binding ShowButton, Converter={StaticResource InverseConverter}}" />

ListViewItemTappedAttached

This ones is definately a project favorite, if you’re not sure what it does be sure to take a look at the samples and read this blog.

<ListView ItemsSource="{Binding MyCars}" fe:ListViewItemTappedAttached.Command="{Binding ItemTapCommand}">

TappedGestureAttached

The easiest way to add a tap gesture to your controls.

<Image Source="xamconsulting.png" fe:TappedGestureAttached.Command="{Binding ImageTappedCommnad}" />

 

That’s it! All we need. Please be sure to take a look at the samples, you can clone from github or download the zip.

Please let me know how it goes.

Thanks

Michael

 

SlideOverKit is now free and open source

I would like to announce that SlideOverKit for Xamarin.Forms is now Free and Open Source.

It’s been two months since SlideOverKit was released and the ‘business plan’ was to have the component as premium component for Xamarin.Forms. A component that we would invest in developing, people would purchase and we would continue developing. Since this release something was bugging me, I was frustrated because not enough people were buying and using the component. We had put alot of effort in building this component and we wanted people to use it.

One of my most enjoyable projects in recent years has been the successful FreshMvvm for Xamarin.Forms, it’s amazing to see people use (and love) something that you’ve built. It’s really good to now be a Contributor to open source not just a consumer, in the past I’ve help fix bugs in jquery mobile but nothing as serious FreshMvvm.

There’s been so many open source projects that I’ve loved developing with like JSON.net, jquery, UserDialogs, MvvmCross etc, etc. I hope that one day people will use and love SlideOverKit also.

So please feel free to consume and contribute.

Links:
https://github.com/XAM-Consulting/SlideOverKit
http://www.xam-consulting.com/slideoverkit-xamarin-forms/
https://www.nuget.org/packages/SlideOverKit/

….. Fingers crossed Xamarin and Xamarin.Forms are also to follow on the open source path ….

Thanks

Michael

 

Announcing FreshMvvm 1.0.1 Release

No bugs to fix, Yay!

Only some awesome new features, actually really nice extended and very useful features. With such a big take up of FreshMvvm we’ve ramped up the development. As always we take feedback and iterate on it so let us know of anything.

WhenAny

I’ve always loved the WhenAny feature in ReactiveUI and just wanted to have it. Not to mention it’s strongly typed which makes it so much better.

So now your ViewModels (or anything with INotifyPropertyChanged) you can subscribe to the changes of a property using the WhenAny features.

Here’s how you can use it:

public ContactPageModel (IDatabaseService dataService)
{
    _dataService = dataService;

    this.WhenAny(HandleContactChanged, o => o.Contact);
}

void HandleContactChanged(string propertyName)
{
    //handle the property changed, nice
}

Pushing different views

Another awesome feature that we’ve been loving is the ability to push with a different view. This means you can have multiple views for a single ViewModel.

Here’s the signature:

Task PushPageModel<T, TPage> (object data, bool modal = false) where T : FreshBasePageModel where TPage : Page;

So it’s as easy as:

PushPageModel<MyViewModel, MySecondView>();

Clean up after page is Popped

FreshBasePageModel now has a PageWasPopped event, this can be used to cleanup after a page has been Popped.

/// <summary>
/// This event is raise when a page is Popped, this might not be raise everytime a page is Popped. 
/// Note* this might be raised multiple times. 
/// </summary>
public event EventHandler PageWasPopped;

We’ve linked up all the parts within the FreshMvvm project so that the event is always called and always called once, but this might not always be the case if you use a CustomNavigationService and don’t implement correctly.

This is a breaking change on the IFreshNavigationService as it now has a NotifyChildrenPageWasPopped().

If you have a custom navigation service you will need to implement this, here’s a sample of how the builtin master detail service handles it.

public void NotifyChildrenPageWasPopped()
{
    if (Master is NavigationPage)
        ((NavigationPage)Master).NotifyAllChildrenPopped();
    foreach (var page in this.Pages.Values)
    {
        if (page is NavigationPage)
            ((NavigationPage)page).NotifyAllChildrenPopped();
    }
}

As always I love your feedback, please let me know how it do

Thanks

FreshMvvm 1.0 Released

So it’s official, FreshMvvm is now 1.0 and available in nuget.

Let’s take a look at some of the new features.

  • Ability to use ViewModel naming instead of PageModel, thanks to this contribution by Olexandr Leuschenko
  • Multiple Navigation Services
  • Support for custom IOC containers
  • Ability to Push a NavigationContainer
  • It also handles async better thanks to Olexandr Leuschenko

Let’s take a look at some of the bigger features in the release.

Multiple Navigation Services

It’s always been possible to do any type of navigation in FreshMvvm, with custom or advanced scenarios were done by implementing a custom navigation service. Even with this ability people found it a little hard to do advanced navigation scenarios in FreshMvvm. After I reviewed all the support questions that came in for FreshMvvm I found that the basic issue people had was they wanted to be able to use our built in navigation containers multiple times, two primary examples are 1) within a master detail having a navigation stack in a master and another in the detail 2) The ability to push modally with a new navigation container. In order to support both these scenarios I concluded that the FreshMvvm required the ability to have named NavigationServices so that we could support multiple NavigationService’s.

Using multiple navigation containers

Below we’re running two navigation stacks, in a single MasterDetail.

var masterDetailsMultiple = new MasterDetailPage (); //generic master detail page

//we setup the first navigation container with ContactList
var contactListPage = FreshPageModelResolver.ResolvePageModel<ContactListPageModel> ();
contactListPage.Title = "Contact List";
//we setup the first navigation container with name MasterPageArea
var masterPageArea = new FreshNavigationContainer (contactListPage, "MasterPageArea");
masterPageArea.Title = "Menu";

masterDetailsMultiple.Master = masterPageArea; //set the first navigation container to the Master

//we setup the second navigation container with the QuoteList 
var quoteListPage = FreshPageModelResolver.ResolvePageModel<QuoteListPageModel> ();
quoteListPage.Title = "Quote List";
//we setup the second navigation container with name DetailPageArea
var detailPageArea = new FreshNavigationContainer (quoteListPage, "DetailPageArea");

masterDetailsMultiple.Detail = detailPageArea; //set the second navigation container to the Detail

MainPage = masterDetailsMultiple;

PushModally with new navigation stack

//push a basic page Modally
var page = FreshPageModelResolver.ResolvePageModel<MainMenuPageModel> ();
var basicNavContainer = new FreshNavigationContainer (page, "secondNavPage");
await CoreMethods.PushNewNavigationServiceModal(basicNavContainer, new FreshBasePageModel[] { page.GetModel() }); 

//push a tabbed page Modally
var tabbedNavigation = new FreshTabbedNavigationContainer ("secondNavPage");
tabbedNavigation.AddTab<ContactListPageModel> ("Contacts", "contacts.png", null);
tabbedNavigation.AddTab<QuoteListPageModel> ("Quotes", "document.png", null);
await CoreMethods.PushNewNavigationServiceModal(tabbedNavigation);

//push a master detail page Modally
var masterDetailNav = new FreshMasterDetailNavigationContainer ("secondNavPage");
masterDetailNav.Init ("Menu", "Menu.png");
masterDetailNav.AddPage<ContactListPageModel> ("Contacts", null);
masterDetailNav.AddPage<QuoteListPageModel> ("Quotes", null);
await CoreMethods.PushNewNavigationServiceModal(masterDetailNav);

Custom IOC Container

The second major request for FreshMvvm 1.0 was to allow custom IOC containers. In the case that your application already has a container that you want to leverage.

Using a custom IOC container is very simple in that you only need to implement a single interface.

public interface IFreshIOC
{
    object Resolve(Type resolveType);
    void Register<RegisterType>(RegisterType instance) where RegisterType : class;
    void Register<RegisterType>(RegisterType instance, string name) where RegisterType : class;
    ResolveType Resolve<ResolveType>() where ResolveType : class;
    ResolveType Resolve<ResolveType>(string name) where ResolveType : class;
    void Register<RegisterType, RegisterImplementation> ()
        where RegisterType : class
        where RegisterImplementation : class, RegisterType;
}

And then set the IOC container in the System.

FreshIOC.OverrideContainer(myContainer);

This release can be found in nuget and the source code on github.

https://www.nuget.org/packages/FreshMvvm/

https://github.com/rid00z/FreshMvvm

Thanks

 

XAML Attached Properties Tricks in Xamarin.Forms

I’m sure you know of behaviours in Xamarin.Forms but have you heard of Attached Properties?

Have you ever wondered how you define properties for a Grid on a Label, eg <Label Grid.Row=”5″, and the Grid just seems to know about it. This is attaching a piece of data onto the Label so that the Grid can reference the data.

Let’s take a look at how it works in the Grids case. In our Xaml we’d normally have something like the code above, so somehow we tell the Grid that we want to be on Row number  5. In order for this to work the Grid needs to have a static ‘attached’ bindable property. Let’s take a look at what the Grid actually has.

public static readonly BindableProperty RowProperty = BindableProperty.CreateAttached ("Row", typeof(int), ...);

So yep the Grid has the attached property for Row, awesome, now how does the Grid get that data?

In order for the Grid to be able to access that data it needs a static method which will extract it as follows.

public static int GetRow (BindableObject bindable)
{
    return (int)bindable.GetValue (Grid.RowProperty);
}

We can also see that the Grid calls this method to get the data from the child element.

int row2 = Grid.GetRow (child);

So that’s some pretty cool stuff.

Now for the Trick

Considering this is a bindable property we can actually attach anything to this static property, our own object or even a command. We can also get notifications when the property changes, during that notification we can obtain references to both the Element and the bindable property. This means we can link up custom behaviours without even using behaviours.

Say for instance we wanted to attached a TapGesture for a View to a Command? Normally this is fairly verbose to add in Xaml but setup correctly it can become just a property on the View.

local:TappedGestureAttached.Command="{Binding OpenNewPage}"

So what’s TappedGestureAttached? Let’s take a look.

Below we have a Static property called CommandProperty, that property name is Command, has a return type of ICommand and a declaring type of View. You can also see it’s linked to  the OnItemTappedChanged command, which means when the property changes that event gets called.

public class TappedGestureAttached
{
    public static readonly BindableProperty CommandProperty =
        BindableProperty.CreateAttached (
            propertyName: "Command",
            returnType: typeof(ICommand),
            declaringType: typeof(View),
            defaultValue: null,
            defaultBindingMode: BindingMode.OneWay,
            validateValue: null,
            propertyChanged: OnItemTappedChanged);

Below we have the OnItemTappedChanged command, as I mentioned before we have access to both the View and the Command hence we can wire up the TapGestureRecognizer.

public static void OnItemTappedChanged(BindableObject bindable, object oldValue, object newValue)
{
    var control = bindable as View;

    if (control != null) {
        control.GestureRecognizers.Clear ();
        control.GestureRecognizers.Add (
            new TapGestureRecognizer() {
                Command = new Command((o) => {

                    var command = GetItemTapped (control);

                    if (command != null && command.CanExecute (null))
                        command.Execute (null);
                })
            }
        );
    }
}

There we have it wiring up a TapGestureRecognizer in less than a line.

Here’s the full code.

public class TappedGestureAttached
{
    public static readonly BindableProperty CommandProperty =
        BindableProperty.CreateAttached (
            propertyName: "Command",
            returnType: typeof(ICommand),
            declaringType: typeof(View),
            defaultValue: null,
            defaultBindingMode: BindingMode.OneWay,
            validateValue: null,
            propertyChanged: OnItemTappedChanged);


    public static ICommand GetItemTapped(BindableObject bindable)
    {
        return (ICommand)bindable.GetValue (CommandProperty);
    }

    public static void SetItemTapped(BindableObject bindable, ICommand value)
    {
        bindable.SetValue (CommandProperty, value);
    }

    public static void OnItemTappedChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var control = bindable as View;

        if (control != null) {
            control.GestureRecognizers.Clear ();
            control.GestureRecognizers.Add (
                new TapGestureRecognizer() {
                    Command = new Command((o) => {

                        var command = GetItemTapped (control);

                        if (command != null && command.CanExecute (null))
                            command.Execute (null);
                    })
                }
            );
        }
    }
}

We can also use this to hook up events that are directly on the control without using the code behind of the Xaml. Below we link up the ListView.ItemTapped event to a Command, which will be inside our ViewModel rather than codebehind.

public class ItemTappedAttached
{
    public static readonly BindableProperty CommandProperty =
        BindableProperty.CreateAttached (
            propertyName: "Command",
            returnType: typeof(ICommand),
            declaringType: typeof(ListView),
            defaultValue: null,
            defaultBindingMode: BindingMode.OneWay,
            validateValue: null,
            propertyChanged: OnItemTappedChanged);


    public static ICommand GetItemTapped(BindableObject bindable)
    {
        return (ICommand)bindable.GetValue (CommandProperty);
    }

    public static void SetItemTapped(BindableObject bindable, ICommand value)
    {
        bindable.SetValue (CommandProperty, value);
    }

    public static void OnItemTappedChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var control = bindable as ListView;
        if (control != null)
            control.ItemTapped += OnItemTapped;
    }

    private static void OnItemTapped(object sender, ItemTappedEventArgs e)
    {
        var control = sender as ListView;
        var command = GetItemTapped (control);

        if (command != null && command.CanExecute (e.Item))
            command.Execute (e.Item);
    }
}

 

Announcing SlideOverKit for Xamarin.Forms

I’m very happy to announce XAM Consulting’s first Premium component release, SlideOverKit for Xamarin.Forms. As I’ve discussed before at XAM Consulting we have a goal to contribute to the Xamarin ecosystem and help companies build great things, our premium components are one part of this goal.

This component is something we’ve been working on for a while after being frustrated with the lack of high quality sliders in Xamarin.Forms.

This component is flexible enough to create any type of Slider you might like, some examples might be a Large Menu that slides from the top of the screen, a small draggable context menu from the right/bottom of the screen or even a right side master detail. There’s a large amount of options that you can tweak to allow you to get your menu looking just right. In this component we’ve done all the slider code in Native (eg we’ve done the hard native work), this means that the component is… 1) it’s super quick 2) you don’t need to use the slow Xamarin.Forms layouts 3) the touch/gesture support is very smooth.

In some ways we would love to give it away for free but after consideration we would prefer to offer a higher quality product with support rather than a half finished product with no support, hence why it’s a ‘Premium Component’. If you would like to read more about our thoughts in regards to pricing components please take a look at this blog post on Pricing Xamarin.Forms Components.

SlideOverKit is available in nuget right now and is available for purchase @ $100 USD. Please head over the the SlideOverKit for Xamarin.Forms website to get more details on how to get started. We have a github repository with a bunch of samples for the component.

Take a look below to see some of the awesome options available for the SlideOverKit.

So check it out SlideOverKit for Xamarin.Forms.








So check it out SlideOverKit for Xamarin.Forms.