Pregunta

Tengo un conjunto de estilos y cepillos definidas en un ResourceDictionary que yo estoy cargando como un MergedDictionary en XAML de mi control de nivel superior:

<ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="/MyAssembly;component/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>

Estoy tratando de opcionalmente reemplazar algunos de estos estilos y cepillos si existe un archivo XAML diferente en el XAP con su propio ResourceDictionary. Estoy tratando de fusionar en este diccionario en tiempo de ejecución antes de InitializeComponent () se llama en mi control de usuario. Estoy utilizando el código siguiente para tratar de hacer esto:

public static class StyleLoader
{
    public static void MergeStyle(string xamlUri)
    {
        try
        {
            XDocument xaml = XDocument.Load(xamlUri);
            ResourceDictionary rd = XamlReader.Load(xaml.ToString()) as ResourceDictionary;
            Application.Current.Resources.MergedDictionaries.Add(rd);

        }
        catch (XmlException ex)
        {
            // if the file doesn't exist, we can't add it
        }
    }
}

El diccionario de recursos del archivo opcional está bien cargado y se fusionó, sin embargo, mi juego original de estilos siempre parece estar anulando esto. Si comento hacia fuera el diccionario fusionada en XAML y simplemente se carga en tiempo de ejecución con el fin de que funciona perfectamente:

    StyleLoader.MergeStyle("/MyAssembly;component/Styles.xaml");
    StyleLoader.MergeStyle("BrushReplacements.xaml");

    InitializeComponent();

Mi problema con esta solución es que sin los estilos por defecto en XAML, no puedo abrir el proyecto en Blend. Alguien tiene alguna idea para una solución que mantendrá mis estilos predeterminados conocidos por Blend, pero me permitirá anular opcionalmente en tiempo de ejecución con un diccionario de recursos dinámicamente cargado? Gracias!

¿Fue útil?

Solución

Aquí es una solución donde los colores / cepillos se aplican con fijaciones en lugar de referirse directamente a los recursos estáticos:
http://blogs.msdn.com/corrinab/archive/ 2009/11/24 / 9927729.aspx
Segunda parte:
http://blogs.msdn.com/corrinab/archive/ 2009/12/02 / 9931283.aspx

En la actualidad creo que algo como esto es la mejor manera de tratar con temas de conmutación de forma dinámica en tiempo de ejecución. Pero requiere mucho trabajo al puerto de una aplicación existente para utilizar un mecanismo como este.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top