Causa malattia, sono a casa a leggermi il super-librone di Petzold su Presentation Foundation. Ho completato la prima parte pure C# e mi sono appena inoltrato nella seconda XAML-oriented. Fa spesso uso della nuova notazione pack:// per fare riferimento a risorse dell'applicazione. Ci sono delle avvertenze ad usare questa notazione, che voglio evidenziare in questo post.
Dunque, supponiamo di aver creato un nuovo progetto Windows Application (WPF). Il template per questo tipo di progetto comprende essenzialmente due files soltanto: App.xaml e Window1.xaml. Quest'ultimo file è una Window a tutti gli effetti. Editiamo il suo costruttore: per raggiungerlo dobbiamo espandere la TreeView e vedere quindi Window1.xaml.cs. Dopo la chiamata al classico InitializeComponent() aggiungiamo il seguente blocco di codice:
Uri uri = new Uri("pack://application:,,,/mia_immagine.gif");
BitmapImage bitmap = new BitmapImage(uri);
Image img = new Image();
img.Source = bitmap;
img.Stretch = Stretch.Fill;
Content = img;
Questo blocco di codice riempie la Windows con un'immagine caricata come risorsa dell'applicazione. Istanzia un oggetto Uri che fa uso di pack:// per puntare al file. Istanzia un oggetto BitmapImage ed un oggetto Image. Quest'ultimo viene messo come contenuto della Window, non prima di aver consentito a WPF di stretchare l'immagine in modo tale che occupi sempre la totalità dell'area della Window.
Prima di eseguire il codice, dobbiamo aggiungere il file mia_immagine.gif al progetto. Non dobbiamo fare altro che fare Add Existing Item e sfogliare una qualsiasi immagine sul nostro hard-disk. Rinominiamola mia_immagine.gif, altrimenti avremo qualche problema. Visual Studio 2005 imposta automaticamente la Build Action per questo file su Resource. ATTENZIONE: non impostatela come Embedded Resource, come mi sono ostinato a fare io per qualche minuto. Gli oggetti Uri che puntano attraverso pack:// funzionano solo con risorse esplicitamente impostate come Resource. A questo punto, se compilate ed eseguite il codice, vi apparirà una finestra nella quale fa bella mostra l'immagine caricata.
Un'altra annotazione è questa: la notazione pack://application funziona solo se state creando un'applicazione vera e propria. Un'exe, insomma. Se state creando una class library, la risorsa non potrà essere caricata. Provate per esempio a cambiare l' Output Type per il progetto (da Windows Application a Class Library, appunto): dovrete innanzitutto cancellare dal progetto il file App.xaml (o almeno modificarne il Build Action che per default vale ApplicationDefinition). Questo file permette la generazione del file App.g.cs (visibile solo se è attiva l'opzione Project --> Show All Files) che istanzia l'applicazione e mostra Window1. Fatto questo, potete compilare senza problemi, ma se provate ad utilizzare la class library in un altro exe, vi accorgerete che pack://application punta sempre al progetto exe della vostra soluzione.
Qualsiasi commento/correzione/rettifica è ben accetta.
Update del giorno dopo: leggete i commenti che mi hanno lasciato Raffaele e Corrado, perchè chiariscono qualche imprecisione/errore che ho lasciato nel post. Mi raccomando, perchè sono importanti!