online - Acceso mediante programación a un recurso estático de Silverlight
xaml tutorial (1)
Me gustaría tener acceso programático a los recursos estáticos tanto como lo haría en XAML:
<TextBlock Text="{Binding Source={StaticResource My.Text.Key}}" />
Esto funciona ya sea que mi recurso estático esté definido en TextBlock, algún elemento principal (por ejemplo, UserControl) o incluso la aplicación. Parece que la expresión de enlace StaticResource sabe cómo subir el árbol de elementos, o el elemento en sí. Me gustaría hacer lo mismo programáticamente:
<UserControl x:Class="MyCustomControl" ...>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources.xaml"/> <!-- Sets ''My.Text.Key'' to System.String ''Hello, World!'' -->
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
</UserControl>
public partial class MyCustomControl
{
public MyCustomControl()
{
InitializeComponent();
string myCustomValue = this.Resources[MyCustomValue] as string; // myCustomValue becomes null!
}
}
Incluso en esta simple prueba, parece que no se puede acceder programáticamente a mi recurso. Y esta es la versión simplificada de lo que estaba tratando de hacer realmente: encontrar un recurso estático a través de un elemento al que tengo adjunta una propiedad dinámica personalizada (por ejemplo, uiElement.Resources [key]).
A pesar de su comentario en contrario, dudo del uso de "." en su clave de recursos es realmente la fuente de su problema. En esta situación, el "." no tiene un significado especial y no afectaría la forma en que se accede al recurso. (He intentado y no he podido reproducir ningún problema con él).
Sin embargo, existe una gran diferencia entre el uso de la extensión de marca {StaticResource MyName}
y un intento de encontrar el recurso mediante programación.
La extensión de marcado hace que XamlParser busque la clave especificada en la propiedad Resources
del FrameworkElement
al que pertenece la propiedad que se le asigna. Si no se encuentra la clave, la busca en FrameworkElement
principal y continúa hasta llegar a la raíz FrameworkElement
. Si aún no se encuentra, tiene un aspecto en la propiedad Recursos de la aplicación.
Por otro lado, este código:
string myCustomValue = this.Resources[MyCustomValue] as string;
sf solo busca en la propiedad Recursos única para el control del usuario. No se intenta cazar la clave en antepasados o en los recursos de la aplicación. Es una búsqueda del diccionario simple. Sospecho que esto es lo que realmente te estaba molestando.
Habiendo dicho eso, yo diría que usar "." en una clave de recurso puede no ser una buena idea. Los "." tiene sentido en varios escenarios XAML, por lo que usarlo en los nombres clave también puede confundir a un desarrollador que lee el código, aunque Silverlight esté bastante satisfecho con él.