Cargar una imagen desde C# y no desde XAML | WinRT

Intermedio

Otros artículos de manipulación de imágenes en WinRT

A veces queremos cargar una imagen dinámicamente, esto es cargarla en cualquier momento durante la aplicación, si hemos sido cuidadosos basta en cambiar la Uri asignada al modelo con el cual estamos haciendo Binding, esto es muy valido, pero en ocasiones simplemente tenemos que hacerlos por código, la primera aproximación a la que llegamos es simplemente reescribir lo que tenemos en XAML a algo muy parecido en C#, en XAML tenemos algo como esto:

Tablet con imagen de conejo

 <Image Source="assets/conejo.bmp"/>

O esto

 <Image Source="{Binding ModelImageUri}" x:Name="imgBitmap"/>

Y para escribirlo en C# lo primero que se nos viene a la cabeza es

 
var instFolder = Package.Current.InstalledLocation;
var imgPath = @"ms-appx:///Assets\conejo.bmp";
imgBitmap.Source = new Uri(imgPath);

De dónde sale 'ms-appx:///'

Que tal si intentamos hallarlo a pura lógica? intentariamos algo como esto:

 
var instFolder = Package.Current.InstalledLocation;
var imgPath = Path.Combine(instFolder.Path, @"Assets\conejo.bmp");
imgBitmap.Source = new Uri(imgPath);

Package.Current.InstalledLocation retorna "ms-appx:///"

Sin embargo esto nos arrojará un error:

error visual studio

 Error   1   Cannot implicitly convert type 'System.Uri' to  'Windows.UI.Xaml.Media.ImageSource'

XAML nos hace la vida muy fácil, con ayuda de converters el engine de XAML se encarga del trabajo sucio , y convierte una cadena de texto, la Uri a una Bitmap que se peude mostrar en un control de tipo Image, pero cuando tienes que hacer el trabajo tu mismo las cosas no son tan fáciles.

A la propiedad source se le debe asignar un objeto con información de un mapa de bits válida, esta se encuentra creando un objeto BitmapImage, que no esta por demás decir que hereda de BitmapSource y que tampoco esta demás decir que hereda de ImageSource, les dije que una vez que conoces el framework de WinRT todo comienza a tomar sentido :)

Este es el código para cargar un control Image desde código fuente.

 
var instFolder = Package.Current.InstalledLocation;
var imgPath = @"ms-appx:///Assets\conejo.bmp";
imgBitmap.Source = new BitmapImage(new Uri(imgPath));