Substituindo dicionários de recursos mesclados na carga de aplicação de Silverlight
-
20-09-2019 - |
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!
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.