È "facile"!Come si porta un tema da Silverlight a WPF?
Mi sono imbattuto in this blog post by Rudi Grobler che dice che è "facile" portare un tema da Silverlight a WPF. Sfortunatamente, non dice come farlo.
Scaricare e installare
Ho installato sia la WPF Toolkit e Silverlight Toolkit da Codeplex.
Sono anche andato a cercare the source code for the theme I'm interested in (BureauBlue) (avviso, questo richiede un po 'di tempo per caricare) e incollato in un nuovo file del dizionario delle risorse nel mio progetto di test.
Ut oh, riferimenti interrotti
un sacco di linee blu ondulata.
alt text http://img32.imageshack.us/img32/6032/brokenreferences.jpg
Nessun riferimento qui
Così, sono andato a aggiungere i riferimenti e scoperto ... non sono elencati.
alt text http://img35.imageshack.us/img35/7466/addreferencedialog.jpg
Ahh, ci si sono
Per fortuna, sono stato in grado di trovare loro dopo una certa vasta navigazione.
alt text http://img269.imageshack.us/img269/3830/addreferencedialogbrows.jpg
E così li
ho aggiunto Avendo trovato i riferimenti mancanti, ho cercato di aggiungerli. Questo in realtà sembrava risolvere i rotti xmlns
collegamenti (almeno le linee ondulate blu è andato via), ma quando ho costruito il mio progetto ho ottenuto un errore:
Error 1 Unknown build error, 'Cannot resolve dependency to assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' because it has not been preloaded. When using the ReflectionOnly APIs, dependent assemblies must be pre-loaded or loaded on demand through the ReflectionOnlyAssemblyResolve event.' NmtConcept
E, quindi chiedo ...
Come faccio a far funzionare un tema Silverlight in WPF?
Aggiornamento !
Bene, pensavo di aver capito. Ho deciso di iniziare con lo DataGrid
.Ho capito quali erano tutti gli equivalenti del WPF per gli assembly Silverlight, e in realtà ho ottenuto il mio progetto per la compilazione e l'esecuzione. E poi ho visto il risultato ...
alt text http://img44.imageshack.us/img44/2418/porteddatagrid.jpg
L'intestazione è in qualche modo corretto (tranne che per le frecce di ordinamento mancanti), ma il resto sembra che ci fosse una sorta di terribile incidente che coinvolge mattoncini colorati tan .
Ecco l'esempio su Silverlight Toolkit webpage.
alt text http://img196.imageshack.us/img196/997/silverlightdatagrid.jpg
Quindi, non ha neanche lontanamente.
Quello che ho fatto
Permettetemi di spiegare quello che ho fatto per arrivare a questo pasticcio.
DataGridFrozenGrid
In primo luogo, ho dovuto prendere DataGridFrozenGrid
da this Silverlight Toolkit source code page perché WPF non aveva mai sentito parlare di un tale classe.
BureauBlue
Poi ho incollato nella pezzi chiave da the source code for BureauBlue (di nuovo, attenzione: questo bambino è lento da caricare).
Con pezzi chiave, voglio dire:
- Tutte le risorse pennello all'inizio del file più
Il
Style
per ciascuno di questi controlli:- DataGridColumnHeader
- DataGridCell
- DataGridRowHeader
- DataGridRow
Stranamente, il file originale conteneva nessuno stile per il DataGrid
stesso (per favore correggetemi se sbaglio, ma ho usato Trova e tutto).
Silverlight -> WPF
Successivamente, ho convertito i riferimenti a xmlns
equivalenti WPF.Ecco come il mio elemento ResourceDictionary
rivelò:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mwc="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
xmlns:mwcp="clr-namespace:Microsoft.Windows.Controls.Primitives;assembly=WPFToolkit"
xmlns:swcp="clr-namespace:System.Windows.Controls.Primitives;assembly=CommonLibraryWpf"
xmlns:sw="clr-namespace:System.Windows;assembly=WPFToolkit">
Io, naturalmente modificato i tag dello spazio dei nomi da abbinare.
Edit fino a quando non funziona
Una volta ho avuto tutto questo lavoro, ho ancora avuto un paio di problemi minori. Alcuni degli elementi x:Name
avevano spazi in essi. Il compilatore non lo permetterebbe, quindi ho dovuto sostituire gli spazi con caratteri di sottolineatura.
Qui ci sono i frammenti rilevanti:
<!-- Important: all underscores used to be spaces -->
<sw:VisualState
x:Name="MouseOver_CurrentRow_Selected">
<sw:VisualState
x:Name="Normal_CurrentRow">
<sw:VisualState
x:Name="Normal_Selected">
<sw:VisualState
x:Name="Normal_EditingRow">
<sw:VisualState
x:Name="Normal_AlternatingRow" />
<sw:VisualState
x:Name="Normal_Selected">
<sw:VisualState
x:Name="MouseOver_Selected">
<sw:VisualState
x:Name="Unfocused_Selected">
La modifica di questi nomi sembrava una pessima idea - e può essere la causa di tutti i miei problemi - ma non sapevo che altro fare per ottenere la cosa da compilare.
L'altro cambiamento che ho dovuto fare è stato: alcune delle SolidColorBrush
e LinearGradientBrush
oggetti all'inizio usato x:Name
invece di x:Key
. Li ho modificati tutti a x:Key
. Forse anche questa era una cattiva idea, ma ancora una volta, il compilatore mi ha fatto.
Questo mi aiuta ad aiutarmi?
Se dopo tutto ci sei ancora, hai qualche suggerimento?
Ah, questo ha senso. In realtà ho il dizionario delle risorse per BureauBlue dal progetto Temi WPF, ma non contiene stili per 'DataGrid',' DataPicker' e 'Calendar'. – devuxer
Bene, ho dato un colpo (vedi aggiornamento alla mia domanda), ma non ha funzionato troppo bene. – devuxer