16

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".Acceder a los elementos ResourceDictionary programáticamente

También he creado un diccionario de recursos llamado Generic.xaml, este se encuentra en la carpeta Themes del conjunto. En ese diccionario de recursos que he definido un ControlTemplate 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 programáticamente referencia/mostrarse la plantilla de control para que pueda asignar 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 eso es themes/generic.xaml.

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

Respuesta

30

Lo resuelve.

que necesitaba:

  • cargar mi diccionario de recursos
  • de combinarlo con los recursos de la aplicación
  • cargar mi plantilla de control del recurso de aplicación

Como parte de la carga del recurso diccionario, también tuve que registrar el esquema de URI 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). Por lo tanto, lo que simplifica hacia abajo, éste 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"]; 

que he publicado los detalles completos de esta solución en this blog post.

+2

Me ahorró mucho tiempo. Muchas gracias por la publicación del blog. Gran trabajo. – captonssj

+2

Solo una nota sobre por qué @slugster hizo esas dos primeras líneas. El estilo 'Uri' del paquete no se carga y registra por defecto, lo que hace que 'Uri uri = new Uri (cualquier cadena de estilo Uri del paquete);' arroje una excepción. Esta forma de registrarlo es menos intrusivo para su código que esperar hasta después de haber creado su primer 'FrameworkElement' antes de permitirse usar el' paquete' Uri. –

Cuestiones relacionadas