2009-10-23 6 views
7

¡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:

  1. Todos los recursos de pincel en el principio del archivo más
  2. 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?

Respuesta

2

Básicamente llegué a la conclusión de que estaba tratando de insertar una clavija cuadrada en un agujero redondo (a pesar de que es "fácil"). El Silverlight DataGrid es muy diferente del WPF Toolkit DataGrid. Entonces, por el momento, he estado tratando de diseñar la cuadrícula de datos predeterminada para que se vea como BureauBlue. Es un trabajo bastante laborioso y está lejos de ser perfecto, pero es una mejora definitiva sobre el estilo portado.

alt text http://img26.imageshack.us/img26/7163/styleddatagrid.jpg

1

Supongo que la referencia no resuelta es a la versión de Silverlight de System.Windows.dll. Tendrá que cambiar las referencias en el proyecto del tema para apuntar a la versión de WPF de los dlls.

También puede ver el proyecto WPF themes (coordinado por Rudi Grobler), que ya tiene el BureauBlue.

+0

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

+0

Bueno, di una oportunidad (ver la actualización de mi pregunta), pero no funcionó demasiado bien. – devuxer

Cuestiones relacionadas