giovedì 4 febbraio 2010

Briciole di WPF : Le risorse incorporate

In WPF, come accade in Windows Form, possiamo incorporare delle risorse (immagini, file sonori, video, etc, etc.) all’interno di un assembly.

La modalità con cui eseguiamo questa operazione è però più vicina al mondo web che non al mondo delle Windows Forms. Per poter inserire un file di risorse all’interno di un nostro assembly è sufficiente creare una o più cartelle all’interno del progetto e, quindi, inserirvi i file da includere come risorse. Per finire è sufficiente che tali file abbiamo la proprietà Build Action impostata su Resource.

Ad esempio, nel seguente progetto abbiamo incorporato 6 immagini e un file audio:

Progetto con risorse incorporate

Nelle Windows Forms, invece, incorporiamo le risorse aggiungendole al file Resources.resx.

Nel caso precedente, nel momento in cui compiliamo, le risorse vengono inserite nell’assembly come stream di byte. Per verificare questo, possiamo aprire l’assembly con le risorse tramite Reflector:
 Le risorse incorporateOsserviamo la presenza di un oggetto memory stream per ogni file di risorsa incorporato. 

Per poter estrarre ed utilizzare le risorse all’interno del nostro codice abbiamo due strade.

La più complessa è quella di creare degli oggetti di classe UnmanagedMemoryStream come nel seguente pezzo di codice in cui estraiamo lo stream relativo alla risorsa “smile.png”:

  1. Dim imageStream As UnmanagedMemoryStream
  2. Dim resourceName = "AssemblyResource.g"
  3. Dim rm As New ResourceManager(resourceName, asm)
  4. Using resSet = rm.GetResourceSet(CultureInfo.CurrentCulture, True, True)
  5.     Dim obj = resSet.GetObject("images/smile.png", True)
  6.     imageStream = CType(obj, UnmanagedMemoryStream)
  7. End Using

Questa modalità è simile a quella che si ottiene utilizzando il metodo GetManifestResourceStream() e, come questa, nasconde la difficoltà di utilizzare uno stream di dati.

Fortunatamente WPF ci mette a disposizione un metodo molto più semplice per referenziare delle risorse incorporate, un metodo che sa molto di web.

A livello di XAML basta scrivere:

  1. <Image Source="images/smile.png"></Image>

Quindi la nostra risorsa è recuperabile con un URI (di tipo relativo) sullo stile delle immagini dei siti web.

Il meccanismo precedente è utilizzabile anche per le risorse presenti in un assembly esterno. In questo caso la sintassi è del tipo:

  1.  
  2. <Image Source="ResourceLib;component/images/sun.png" />

Anche dal punto di vista del code behind di WPF, possiamo impostare la proprietà Source di un controllo image tramite un URI:

  1. Me.Image.Source = New BitmapImage(
  2.                         New Uri("images/smile.png",
  3.                                 UriKind.Relative))

In download potete trovare una semplice solution di Visual Studio 2010 in cui mostro come effettuare il caricamento di un’immagine da una serie di risorse utilizzando l’uri:

Applicazione WPF con le risorse incorporate

Nessun commento: