silverlight silverlight-3.0 resources controltemplate resourcedictionary

silverlight - Acceda a los elementos de ResourceDictionary mediante programación



silverlight-3.0 resources (1)

Tengo un conjunto de controles Silverlight, llamado "MySilverlightControls". Varias carpetas en ese ensamblaje Tengo una clase que extiende una columna de cuadrícula de un proveedor externo, llamémosla "MyImageColumn.cs".

También creé un diccionario de recursos llamado Generic.xaml , que se encuentra en la carpeta Themes del ensamblaje. En ese diccionario de recursos, he definido una plantilla de control llamada MyImageColumnTemplate :

<ControlTemplate x:Name="MyImageColumnTemplate" > <Grid Margin="8,8,4,4" MaxHeight="32" MaxWidth="32"> <Grid.Resources> <localGrid:StatusColumnImageConverter x:Key="ImageContentConverter"/> </Grid.Resources> <Border Margin="5,5,0,0" Background="Black" Opacity="0.15" CornerRadius="5" /> <Border Background="#FF6E6E6E" CornerRadius="4,4,4,4" Padding="4" Margin="0,0,5,5"> <Border Background="White" CornerRadius="2,2,2,2" Padding="3"> <Image Source="{Binding EditValue, Converter={StaticResource ImageContentConverter}}" Stretch="Uniform"/> </Border> </Border> </Grid> </ControlTemplate>

Mi pregunta es: desde MyImageColumn, ¿cómo puedo hacer referencia / cargar esta plantilla de control de forma programática para poder asignarla a una propiedad en la columna? Esperaría usar una sintaxis similar a esto:

ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];

pero esto siempre devuelve nulo. Cuando cargo el ensamblaje en Reflector, veo que el archivo Generic.xaml está allí, el nombre del recurso es MySilverlightControls.g.resources , y la ruta dentro de este es themes/generic.xaml .

¿Cómo puedo acceder a los elementos individuales en este diccionario de recursos?


Lo tengo resuelto.

Lo necesitaba:

  • cargar mi diccionario de recursos
  • fusionarlo con los recursos de la aplicación
  • cargar mi plantilla de control desde el recurso de la aplicación

Como parte de cargar el diccionario de recursos, también tuve que registrar el esquema de URI del pack . Luego tuve que lidiar con algunas locas excepciones basadas en COM debido a pequeños errores con mi xaml. También tuve que mover mi xaml a un archivo de diccionario de recursos por separado, tratando de hacerlo a través de genéricos.xaml mantenía errores de lanzamiento (a pesar de que el xaml no tenía errores y podía cargarse bien usando el archivo de diccionario de recursos recién creado). Entonces, simplificándolo, este era el código:

if (!UriParser.IsKnownScheme("pack")) UriParser.Register(new GenericUriParser(GenericUriParserOptions.GenericAuthority), "pack", -1); ResourceDictionary dict = new ResourceDictionary(); Uri uri = new Uri("/MySilverlightControls;component/themes/Dictionary1.xaml", UriKind.Relative); dict.Source = uri; Application.Current.Resources.MergedDictionaries.Add(dict); ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];

He publicado todos los detalles de esta solución en esta publicación de blog .