WPF al servizio del Web

L’idea di poter realizzare immagini in WPF e poi pubblicarle sul web è nata un pomeriggio insieme al mio collega Matteo. Di per se la realizzazione è banale: Il classico HttpHandler che riceve una richiesta con dei parametri, chiama una libreria e ritorna un array di byte al browser. Quello che è stato fatto invece va ben oltre. La libreria comprende un controllo chiamato XamlImage che eredita da System.Web.UI.WebControls.Image e che ha diverse proprietà fra cui: ImageType di tipo ImageType (enumerazione con valori Gif, Jpg, Png); XamlFile che contiene il percorso relativo del file Xaml che si vuole renderizzare; Parameter che è una lista di oggetti XamlImageParameter che viene usata per passare i parametri al motore di WPF che effettuerà il bindign prima di renderizzare l’immagine. Questo è un esempio di configurazione del controllo all’interno della pagina di esempio: <ff:XamlImage ID="XamlImage1" runat="server" ImageType="Png" XamlFile="~/Xaml/ImageRender.xaml"> <ff:XamlImageParameter Name="BorderBrush" Value="Blue" /> <ff:XamlImageParameter Name="BorderThickness" Value="2" /> <ff:XamlImageParameter Name="CornerRadius" Value="5" /> <ff:XamlImageParameter Name="RotationAngle" Value="0" /> <ff:XamlImageParameter Name="ShadowDepth" Value="10" /> </ff:XamlImage> I vari parametri di tipo XmlImageParameter che sono stati inseriti nel controllo, non sono le vere proprietà dei controlli WPF, ma solamente dei nomi delle proprietà che sono bindate ai controlli effettivi. Ma questo ve lo spiega meglio Matteo che ha realizzato la libreria come mi serviva. :-) Nel metodo Render, il controllo costruisce il link per recuperare l’immagine passando tutti i parametri dichiarati come parametri in querystring. Ma a quale immagine punta il controllo? Punta nient’altro che all’indirizzo del file Xaml dichiarato con l’aggiunta dell’estensione webXaml. Bisogna quindi andare a registrare nel webconfig l’HttpHandler per gestire questo tipo di richieste, operazione che è stata resa facile grazie al designer del controllo che tramite smarttag permette di fare questa operazione con un solo click. Il problema principale nella realizzazione dell’HttpHandler è stato quello di istanziare e usare gli oggetti di WPF all’interno dell’HttpHandler. WPF funziona in modalità STA ovvero “Single Thread Apartment” mentre ASP.NET no. Cercando su Google il metodo che viene maggiormente utilizzato è quello descritto in questo post del grande Rick Strahl. La realizzazione di questa libreria è stata molto utile anche come esercizio per la creazione di designer per controlli custom. Questa libreria è sicuramente migliorabile sotto diversi aspetti (non ho effettuato nessun tipo di test per quanto riguarda le performance), ma comunque è da prendere come esempio per la creazione di controlli custom e per la realizzazione di HttpHandler un po' diversi dai soliti. :-) In allegato la libreria con un sito di test. XamlImageGenerator.zip (603,79 kb)

About the author


Fabio Franzini is Senior Consultant, Software Engineer and Trainer, specializing mainly on SharePoint, ASP.NET, web solutions and in general about everything that revolves around the Microsoft web platform. [more]

Translate

Month List

Page List