16

J'ai un ensemble de contrôles Silverlight, appelé "MySilverlightControls". Plusieurs dossiers dans cet assemblage j'ai une classe qui étend une colonne de la grille d'un fournisseur tiers, appelons-le "MyImageColumn.cs".Accès aux éléments ResourceDictionary par programme

J'ai également créé un dictionnaire de ressources appelé Generic.xaml, situé dans le dossier Themes de l'assembly. Dans ce dictionnaire de ressources que j'ai défini un ControlTemplate appelé 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> 

Ma question est: de MyImageColumn, comment puis-je faire référence à programme/charger ce modèle de contrôle pour que je puisse l'affecter à une propriété sur la colonne? Je voudrais utiliser une syntaxe similaire à celle-ci:

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

mais cela retourne toujours null. Lorsque je charge l'assemblage dans Reflector, je vois que le fichier Generic.xaml est là, le nom de la ressource est MySilverlightControls.g.resources, et le chemin à l'intérieur est themes/generic.xaml.

Comment exactement puis-je accéder aux éléments individuels de ce dictionnaire de ressources?

Répondre

30

Vous l'avez résolu.

je devais:

  • charger mon dictionnaire de ressources
  • fusionner avec les ressources de l'application
  • charger mon modèle de contrôle de la ressource d'application

Dans le cadre de chargement de la ressource dictionnaire, j'ai également dû enregistrer le schéma URI pack. J'ai ensuite dû faire face à certaines exceptions basées sur COM fou en raison de légères erreurs avec mon xaml. J'ai également dû déplacer mon xaml dans un fichier de dictionnaire de ressources séparé, en essayant de le faire via generic.xaml en jetant des erreurs (même si le xaml était parfait et pouvait être chargé correctement en utilisant le fichier de dictionnaire de ressources nouvellement créé). Donc, ce qui simplifie le bas, ce fut le code:

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"]; 

J'ai posté tous les détails de cette solution dans this blog post.

+2

J'ai économisé beaucoup de temps. Merci beaucoup pour l'article du blog. Bon travail. – captonssj

+2

Juste une note sur pourquoi @slugster a fait ces deux premières lignes. Le style Uri 'pack' n'est pas chargé et enregistré par défaut, provoquant Uri uri = new Uri (n'importe quelle chaîne de style Uri pack);' lancer une exception. Cette façon de l'enregistrer est moins intrusive pour votre code que d'attendre après avoir créé votre premier 'FrameworkElement' avant de vous autoriser à utiliser l'Uri' pack'. –