When developing a Xamarin Forms cross platform application, we’ll have a shared library where (hopefully) the bulk of our code will go, be it C# or XAML.
However we may still need to make platform specific changes to our XAML, whether it’s images, margins, padding etc. Along with the possible differences per platform we also have the added complexity of the idiom, i.e. desktop, phone or tablet (for example) which might require differences, for example maybe we display more controls on a tablet compared to the phone.
OnPlatform
We’re still likely to need to handle different platforms within this shared code, for example in Xamarin Forms TabbedPage we used OnPlatform like this
<ContentPage.Icon> <OnPlatform x:TypeArguments="FileImageSource"> <On Platform="iOS" Value="history.png"/> </OnPlatform> </ContentPage.Icon>
The above simply declares that on iOS the ContentPage Icon is used and is located in the file history.png.
We can handle more than just images, obviously we might look to handle different margins, fonts etc. depending upon the platform being used.
We can declare values for multiple platforms using comma separated values in the Platform attribute, for example
<OnPlatform x:TypeArguments="FileImageSource"> <On Platform="iOS, Android" Value="history.png"/> <On Platform="UWP" Value="uwphistory.png"/> </OnPlatform>
OnPlatform’s Platform attribute currently supports iOS, Android, UWP, macOS, GTK, Tizen and WPF.
Ofcourse we can simply use Device.RuntimePatform in code-behind to find out what platform the application is running on if preferred.
OnIdiom
Working in much the same was as OnPlatform. OnIdiom is used for handling different XAML or code based upon the current device is classed as a Unsupported, Phone, Tablet, Desktop, TV or Watch.
In XAML we might change the StackLayout orientation, for example
<StackLayout.Orientation> <OnIdiom x:TypeArguments="StackOrientation"> <OnIdiom.Phone>Vertical</OnIdiom.Phone> <OnIdiom.Tablet>Horizontal</OnIdiom.Tablet> </OnIdiom> </StackLayout.Orientation>
We can use the Idiom within code-behind by checking the state of Device.Idiom.