2010-06-11 12 views
7

He desarrollado una aplicación que permite al usuario cambiar de tema. Estoy haciendo esto mediante la inclusión del archivo XAML como un recurso en mi proyecto y utilizando el siguiente código:Usar un diccionario de recursos como tema en Silverlight

MainTheme.ThemeUri = new Uri("SilverlightApplication1;component/Themes/[ThemeName]/Theme.xaml", UriKind.Relative); 

Esto funcionó bien, hasta que me encontró estos temas: http://timheuer.com/blog/archive/2010/05/17/silverlight-4-tools-released-and-new-application-templates.aspx

La diferencia es que estos temas consta de múltiples archivos. Así que hice un archivo Theme.xaml que solo incluye MergedDictionaries, así que aún podía usar el código anterior. Este es el archivo Theme.xaml para el tema Cosmopolitan.

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="CoreStyles.xaml"/> 
     <ResourceDictionary Source="SDKStyles.xaml"/> 
     <ResourceDictionary Source="Styles.xaml"/> 
     <ResourceDictionary Source="ToolkitStyles.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

Sin embargo, cuando ejecuto el código C# anterior me sale el siguiente excepción:

System.Windows.Markup.XamlParseException: Failed to assign to property 'System.Windows.ResourceDictionary.Source'. 

Para que quede claro, utilizando el método MergedDictionaries funciona cuando me puse en mi App.xaml:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Themes/Cosmopolitan/Theme.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

¿Qué estoy haciendo mal?

Gracias!

+0

Definición de rutas absolutas en mi archivo Theme.xaml también no funciona :( – SaphuA

+0

tuve un problema similar y la causa fue utilizar una barra diagonal inversa (\) en lugar de barra inclinada (/) al hacer referencia al archivo. El analizador xaml en VS pudo resolver la ubicación, pero en tiempo de ejecución se generó un error. Esperamos que esto ayude a otra persona –

Respuesta

10

Cuando está utilizando MergedDictionary debe utilizar un nombre completo como el siguiente.

<ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/SilverlightApplication1;component/Themes/Cosmopolitan/Theme.xaml"/> 

Además, tenga en cuenta que no se puede perder la barra antes del nombre de ensamblado. En otras palabras, debe ser como

Source="/SilverlightApplication1; 
no

gustaría

Source="SilverlightApplication1; 

HTH

+5

no tienes que poner 'componente' en popa er el nombre del ensamblado "/SilverlightApplication1;component/Themes/Cosmopolitan/Theme.xaml" – user20358

+0

Sí, debe colocar el componente. Eso es correcto. – Lance

+1

@Prince: la parte del componente es esencial. Por favor considere actualizar su respuesta. Será una gran respuesta después de esa actualización. –

Cuestiones relacionadas