Pergunta

Eu tenho um conjunto de estilos e pincéis definidos em um recurso que estou carregando como um MergedDictionary em xaml do meu controle de nível superior:

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

estou tentando opcionalmente Substitua alguns desses estilos e pincéis se houver um arquivo XAML diferente no XAP com seu próprio recurso. Estou tentando se fundir neste dicionário no tempo de execução antes que o InitializEComponent () seja chamado no meu controle de usuário. Estou usando o seguinte código para tentar fazer isso:

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
        }
    }
}

O dicionário de recursos do arquivo opcional é carregado e mesclado, no entanto, meu conjunto original de estilos sempre parece estar substituindo isso. Se eu comentar o dicionário mesclado em xaml e simplesmente carregá -los em tempo de execução para que funcione perfeitamente:

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

    InitializeComponent();

Meu problema com esta solução é que, sem os estilos padrão no XAML, não posso abrir o projeto no Blend. Alguém tem alguma idéia para uma solução que mantenha meus estilos padrão conhecidos por misturar, mas me permitirá substituí -los opcionalmente em tempo de execução por um dicionário de recursos carregados dinamicamente? Obrigado!

Foi útil?

Solução

Aqui está uma solução em que as cores/escovas são aplicadas com ligações em vez de se referir diretamente aos recursos estáticos:
http://blogs.msdn.com/corrinab/archive/2009/11/24/9927729.aspx
Parte dois:
http://blogs.msdn.com/corrinab/archive/2009/12/02/9931283.aspx

Atualmente, acho que algo assim é a melhor maneira de lidar com os temas de troca dinâmica em tempo de execução. Mas isso requer muito trabalho para portar um aplicativo existente para usar um mecanismo como este.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top