Certain types of things are basically impossible to do in cross-platform
mobile code today, yet there's no reason why. Writing a ViewModel that handles
loading a gallery of pictures from disk will be completely riddled with
#ifdefs
and basically unreadable.
Splat aims to fix that, by providing a usable leaky abstraction above platform
code. It is leaky, because it always provides an extension method ToNative()
and FromNative()
, which converts the abstraction to the platform-specific
version. Load the image in the cross-platform code, then call ToNative()
in
your view to actually display it.
Splat currently supports:
- Cross-platform image loading/saving
- A port of System.Drawing.Color for portable libraries
- Cross-platform geometry primitives (PointF, SizeF, RectangleF), as well as a bunch of additional extension methods to make using them easier.
- A way to detect whether you're in a Unit Test runner / Design Mode
- A cross-platform logging framework
- Simple yet flexible Service Location
//
// Load an Image
// This code even works in a Portable Library
//
var wc = new WebClient();
byte[] imageBytes = await wc.DownloadDataTaskAsync("http://octodex.github.com/images/Professortocat_v2.png");
// IBitmap is a type that provides basic image information such as dimensions
IBitmap profileImage = await BitmapLoader.Current.Load(imageBytes, null /* Use original width */, null /* Use original height */);
Then later, in your View:
// ToNative always converts an IBitmap into the type that the platform
// uses, such as UIBitmap on iOS or BitmapSource in WPF
ImageView.Source = ViewModel.ProfileImage.ToNative();
// This System.Drawing class works, even on WinRT or WP8 where it's not supposed to exist
// Also, this works in a Portable Library, in your ViewModel
ProfileBackgroundAccentColor = new Color(255, 255, 255, 255);
Later, in the view, we can use it:
ImageView.Background = ViewModel.ProfileBackgroundAccentColor.ToNativeBrush();
// If true, we are running unit tests
ModeDetector.InUnitTestRunner();
// If true, we are running inside Blend, so don't do anything
ModeDetector.InDesignMode();
Always Be NuGetting. Package contains binaries for:
- Xamarin.iOS
- Xamarin.Android
- Xamarin.Mac
- WPF (.NET 4.5)
- Windows Phone 8
- WinRT