Excepción al agregar un ResourceDictonary en tiempo de ejecución
-
30-09-2019 - |
Pregunta
Estoy tratando de desarrollar una forma de cambiar el estilo de aplicaciones de Windows Phone 7 en función de un ajuste. Los estilos se parecen a esto:
- estilos de núcleo se separan y definen en WP7Style_Dark.xaml y WP7Style_Light.xaml
- el resto de los estilos se declaran en Styles.xaml
Yo uso el siguiente código para conectar los temas en App.xaml.cs:
var dictionaries = Resources.MergedDictionaries;
dictionaries.Clear();
string source = String.Format("/CommonUI;component/Resources/{0}.xaml", value == AppStyleSet.Light ? "WP7Style_Light" : "WP7Style_Dark");
//base styles
var themeStyles = new ResourceDictionary {Source = new Uri(source, UriKind.Relative)};
dictionaries.Add(themeStyles);
var generalStyles = new ResourceDictionary();
generalStyles.Source = new Uri("/CommonUI;component/Resources/Styles.xaml",UriKind.Relative);
dictionaries.Add(generalStyles);
Cuando se ejecuta, el establecimiento de generalStyles.Source produce una excepción (que es un System.Exception que indica 'Error no especificado'). He descubierto la excepción desaparece si me vacío del Styles.xaml, pero esto no es una solución, por supuesto.
¿Qué debo hacer?
Actualización 2: atornillar el seguimiento de la pila, aquí está el problema redujo:
Los estilos de tema definen los colores del tema. Los estilos generales mantienen bien la carga hasta que se encuentran una unión, como éste
... <Setter Property="Color" Value="{StaticResource HighlightColor}" />
Por lo tanto, la StaticResource deja de ser resuelto y produce la excepción. Se puede evitar de alguna manera?
Solución
El problema que he encontrado con este enfoque es que no parece haber una cierta asincronía acerca de cómo los recursos del diccionario se autocarga de la URL en la propiedad Source
. De ahí que cuando uno usa diccionario {StaticResource key}
donde key
se encuentra en un diccionario anterior se puede fallar.
Una solución solución sería la de extraer el Xaml usando Application.GetResourceStream
y StreamReader
. Luego de usar XamlReader
para construir el ResourceDictionary
. De esa manera usted puede estar seguro de que los diccionarios dependientes pueden encontrar recursos estáticos que necesitan.
Tenga en cuenta que se necesita para asegurarse de que haya añadido en cada diccionario para que sea parte del árbol Application.Resources
antes diccionarios dependientes adicionales de carga.
Otros consejos
WP7 está basada en Silverlight 3+ y por defecto no es posible crear un nuevo diccionario de recursos en el código, por lo que usted está recibiendo un System.Exception
que se expresará una "UnspecifiedError".
La solución, simple crear un ResourceDictionary como si estuviera usando Silverlight3 - seguir este tutorial .
Espero que esto resuelve el problema.