Crear un fichero de estilos XAML y acceder a estilos definidos en otro fichero

 

Pues eso… que estaba yo haciendo modificaciones en los estilos que vienen en el fichero StandardStyles.xaml (incluido en las plantillas de aplicaciones para Windows Store), y como no tenía muy claro cómo definir esas modificaciones en otro fichero diferente del que se incluye en las plantillas de los proyectos para Windows Store, al final acabé dejándolos en ese mismo fichero.

Pero hoy (o ayer, ya no llevo la cuenta de los días y las noches) me puse a hacerlo (de nuevo), es decir, me fui a agregar un nuevo fichero del tipo ResourceDictionary (Dictionary1.xaml) y ahí pegué los estilos que yo definí para usar en otra aplicación y que lo mismo me podrán ser de utilidad en esta nueva.

Una vez que has creado un nuevo "diccionario de recursos", debes añadirlo al elemento ResourceDictionary de App.xaml, concretamente en ResourceDictionary.MergedDictionaries, que uno sabe esto, entre otras cosas porque ahí es donde está indicado el fichero de estilos estándar.

Como mis nuevos estilos (algunos de ellos) están basados en los que se incluyen en StandardStyles.xaml, lo que hice es agregarlo después del StandardStyles (por aquello de que así referencie primero el estándar y después el mío). Pero no… así no vale.

El problema es que además el Visual Studio no te dice nada de que eso está mal, la cuestión es que la aplicación no funciona y, lo más frustrante es que no sabes por qué.
Ahora sé que es porque estaba haciendo referencia a estilos que no estaban definidos (al menos en mi fichero).
Pero el problema es que yo "sabía" que sí, que esos estilos estaban definidos, pero en otro fichero.
Y ese era el problema, que estaban en otro fichero.

Busqué en la ayuda a ver… y curiosamente vi que en uno de los ejemplos había dos ficheros definidos en MergedDictionaries de App.xaml. Y en realidad eso hay que hacerlo así:

 

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>

            <!-- 
                Styles that define common aspects of the platform look and feel
                Required by Visual Studio project and item templates
             -->
            <ResourceDictionary Source="Common/StandardStyles.xaml"/>
            <ResourceDictionary Source="Dictionary1.xaml"/>
            
        </ResourceDictionary.MergedDictionaries>

        <!-- Application-specific resources -->

        <x:String x:Key="AppName">Libros SplitApp</x:String>
    </ResourceDictionary>
</Application.Resources>

 

Pero lo que debes saber (todo este rollo para contarte esto) es que si tu fichero va a usar estilos definidos en otro fichero (al menos si tu intención es crear nuevos estilos que se basen en algunos de los definidos en ese fichero) debes indicarlo de forma explícita en tu fichero, y sería incluyéndolo en un elemento del tipo MergedDictionaries, pero en tu fichero.

Por ejemplo, si desde mi fichero Dictionary1.xaml quiero utilizar estilos definidos en StandardStyles debo añadir este código al principio del fichero (o en la parte superior, después de las definiciones de ResourceDictionary):

 

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Libros_SplitApp">

    <ResourceDictionary.MergedDictionaries>
        <!-- 
                    Styles that define common aspects of the platform look and feel
                    Required by Visual Studio project and item templates
                 -->
        <ResourceDictionary Source="Common/StandardStyles.xaml"/>
    </ResourceDictionary.MergedDictionaries>

    <!-- Mis estilos basados en otros existentes en StandardStyles.xaml -->
  

 

Para que nos entendamos:

1.- Si quiero que en mi aplicación los recursos definidos en mi fichero estén accesibles, debo indicarlo en MergedDictionary de App.xaml.

2.- Si quiero que mi fichero utilice estilos definidos en otro fichero de estilos XAML debo crear un elemento MergedDictionary y añadirlo de la misma forma que el mío está indicado en App.xaml.

 

Y eso es todo…

Pero habrá más, ya que el XAML no se lleva muy bien que digamos con el "depurador" de Visual Studio y hay más cosas que pueden pasar sin que sepas por qué pasan… aunque para eso estoy yo aquí, par contártelo 😉

 

Nos vemos.

Guillermo

Esta entrada fue publicada en cosas técnicas, mis cosas y etiquetada , , , . Guarda el enlace permanente.