¡Es "fácil"!¿Cómo transfiere un tema de Silverlight a WPF?
Me encontré con this blog post by Rudi Grobler que dice que es "fácil" trasladar un tema de Silverlight a WPF. Desafortunadamente, él no dice cómo hacerlo.
Descargar e instalar
He instalado tanto el WPF Toolkit y Silverlight Toolkit de CodePlex.
También fui y desenterré the source code for the theme I'm interested in (BureauBlue) (advirtiendo, esto toma un poco de tiempo para cargar), y pegué eso en un nuevo archivo de diccionario de recursos en mi proyecto de prueba.
Ut oh, referencias rotas
un montón de líneas azules onduladas.
alt text http://img32.imageshack.us/img32/6032/brokenreferences.jpg
No hay referencias aquí
Así, fui a añadir las referencias y descubierto ... no se enumeran.
alt text http://img35.imageshack.us/img35/7466/addreferencedialog.jpg
Ahh, ahí están
Afortunadamente, yo era capaz de encontrar después de una extensa navegación.
alt text http://img269.imageshack.us/img269/3830/addreferencedialogbrows.jpg
Y así que les
añade Después de haber encontrado las referencias que faltan, me trataron de añadirlos. En realidad, esto parecía resolver los rotos xmlns
enlaces (al menos las líneas onduladas de color azul se fueron), pero cuando construí mi proyecto me dio un error:
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
Y, por lo que te pido ...
¿Cómo puedo hacer que un tema de Silverlight funcione en WPF?
¡Actualización!
Bueno, pensé que lo había resuelto. Decidí comenzar con DataGrid
.Calculé cuáles eran todos los equivalentes de WPF para los ensamblajes de Silverlight, y de hecho conseguí que mi proyecto se compilara y ejecutara. Y entonces vi el resultado ...
alt text http://img44.imageshack.us/img44/2418/porteddatagrid.jpg
La cabecera es algo correcto (a excepción de las flechas de ordenación que faltan), pero el resto de lo que parece como si hubiera algún tipo de horrible accidente que involucra ladrillos de color habano .
Aquí está el ejemplo en el Silverlight Toolkit webpage.
alt text http://img196.imageshack.us/img196/997/silverlightdatagrid.jpg
Por lo tanto, ni siquiera se acercan.
Lo que hice
Por favor, permítanme explicar lo que hice para llegar a este lío.
DataGridFrozenGrid
En primer lugar, tenía que agarrar DataGridFrozenGrid
de this Silverlight Toolkit source code page porque WPF nunca había oído hablar de tal clase.
BureauBlue
Entonces me pega en las piezas clave de the source code for BureauBlue (de nuevo, la advertencia: este bebé es lento para cargar).
Por piezas clave, quiero decir:
- Todos los recursos de pincel en el principio del archivo más
El
Style
para cada uno de estos controles:- DataGridColumnHeader
- DataGridCell
- DataGridRowHeader
- DataGridRow
Curiosamente, el archivo original no contenía estilo para el DataGrid
sí mismo (por favor, corríjanme si me equivoco, pero utiliza Buscar y todo).
Silverlight -> WPF
A continuación, convierte los xmlns
referencias equivalentes de WPF.Así es como mi elemento ResourceDictionary
resultó:
<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">
que, por supuesto, editado las etiquetas de espacio de nombres para que coincida.
Editar hasta que funcione
Una vez que tuve todo este trabajo, todavía tenía algunos problemas menores. Algunos de los elementos x:Name
tenían espacios en ellos. El compilador no permitió esto, así que tuve que reemplazar los espacios con guiones bajos.
Éstos son los fragmentos relevantes:
<!-- 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">
El cambio de estos nombres que parecía una muy mala idea - y puede ser la causa de todos mis problemas - pero yo no sabía qué más hacer para obtener la cosa para compilar.
El otro cambio que tenía que hacer era: algunos de los SolidColorBrush
y LinearGradientBrush
artículos al principio utilizaron x:Name
en lugar de x:Key
. Cambié todos a x:Key
. Quizás esta también fue una mala idea, pero de nuevo, el compilador me hizo.
¿Esto me ayuda ayudarme?
Si todavía está conmigo después de todo eso, ¿tiene alguna sugerencia?
Ahh, eso tiene sentido. De hecho, tengo el diccionario de recursos para BureauBlue del proyecto Temas de WPF, pero no contiene estilos para 'DataGrid',' DataPicker' y 'Calendar'. – devuxer
Bueno, di una oportunidad (ver la actualización de mi pregunta), pero no funcionó demasiado bien. – devuxer