In WPF si può dire che i controlli di default non hanno un layout, ma è lo style ad esso applicato che gli dà un certo aspetto e funzionalità. Poiché una finestra in Avalon è indipendente delle care e vecchie librerie Win32 in WPF l'interfaccia emula quella del sistema operativo corrente mediante l'uso degli style. Questi possono applicarsi a qualsiasi tipo, come un Button o una TextBox o identificabili per chiave.
Quando scriviamo codice xaml e lo compiliamo, produciamo un assembly contenente nelle risorse il file xaml stesso, ottimizzato per dimensione e velocità di caricamento che prende il nome di baml.
Spulciando tra gli assembly di WinFX si trovano due assembly di nome PresentationFramework.Classic e PresentationFramework.Luna che contengono solo le risorse di styling per Windows Classic e Windows Luna (lo style di XP).
Tutta questa introduzione è per dirvi che nella CTP di dicembre ho trovato anche un PresentationFramework.Aero che mi ha illuminato e mi ha spinto a trovare un modo per forzare l'uso dello style di Aero (nome in codice dello style di Vista) anche su XP o Windows 2003.
Impostare uno style a runtime è relativamente semplice: gli Style si definisco all'interno della dictionary Resources esposto da ogni FrameworkElement. Questo permette di definire style limitati ad un contenitore oppure a livello di intera applicazione tramite Application.Resources.
Per caricare invece un file xaml nella classe Application è disponibile il metodo LoadComponent (sfruttato dal compilatore di WPF) che vuole l'uri della risorsa xaml o baml e restituisce l'object istanziando c'ho che appunto la struttura xml rappresenta. Poiché la risorsa in questione si trova in un'altra dll, ho navigato con il buon reflector e fortunatamente ho scovato la formattazione dell'uri per prelevare una risorsa da un'assembly:
nomeAssembly;V1.0.0.0;token;nomeRisorsa
Detto questo, con le seguenti tre righe di codice ecco come applicare lo style di Aero:
Dim u As New Uri("PresentationFramework.Aero;V6.0.5070.0;31bf3856ad364e35;component\themes/aero.normalcolor.baml", UriKind.RelativeOrAbsolute) Dim aero As Object = Application.LoadComponent(u) Me.Resources = aero
Sinceramente non mi è chiaro quel component\ iniziale poiché il nome della risorsa è solo themes/aero.normalcolor.baml, ma spero di scoprirlo.
Ed eccovi il risultato
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Visual Studio 11 beta: le novità di WPF 4.5, l'1 marzo 2012 alle 19:32
- Spettro audio con WPF, il 28 novembre 2007 alle 23:24
- Controllo WPF: AdvancedListBox, il 24 ottobre 2007 alle 19:24
- Multithreading WPF nel Binding, il 21 ottobre 2007 alle 23:40
- Com'è fatto il formato BAML di WPF?, il 12 settembre 2007 alle 21:31
- WPF attached properties + extension methods, il 10 giugno 2007 alle 22:12