Question

Je fais une application WPF qui va avoir plusieurs peaux de marque dans notre système de construction. Idéalement, nous aimerions l'application à la liste de la peau disponibles que certains auront construit un à plusieurs peaux.

Lors de l'exécution est-il un moyen d'énumérer tous les dictionnaires de ressources dans un dossier spécifique?

Je veux éviter de coder en dur les noms de fichiers XAML dans mon codebehind car cela est une évolution de la situation.

Était-ce utile?

La solution

En quelque sorte.

Vous pouvez énumérer tous les fichiers BAML (XAML compilé) comme suit:

  var resourcesName = assembly.GetName().Name + ".g";
  var manager = new System.Resources.ResourceManager(resourcesName, assembly);
  var resourceSet = manager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
  var allXamlFiles =
    from entry in resourceSet.OfType<DictionaryEntry>()
    let fileName = (string)entry.Key
    where fileName.EndsWith(".baml")
    select fileName.Substring(0, fileName.Length-5) + ".xaml";

Il n'y a aucun moyen de savoir quels sont ceux de ces derniers sont ResourceDictionaries et qui sont les autres XAML tels que Windows ou UserControls sans réellement les charger. Donc, la réponse à votre question directe est « non » à moins que vous chargez chaque XAML vous trouvez pour vérifier si elle est un ResourceDictionary. Ce serait très lent.

Par contre, si vous êtes prêt à utiliser un schéma de nommage pour vos ResourceDictionaries, vous pouvez énumérer tous BAMLs dans votre assemblage et sélectionnez selon correspondent à votre schéma de nommage, et la confiance qu'ils sont ResourceDictionaries. Il suffit d'étendre la clause « où » dans la requête ci-dessus.

Par conséquent, la réponse est "en quelque sorte."

Autres conseils

ici est une solution que j'ai trouvé @ microsoft

WPF enveloppe le ResourceDictionary dans les « Assembly.g.resources », on peut obtenir le nom de la ressource « Assembly.g.resources » par GetManifestResourceNames(). Après cela, nous pouvons utiliser la classe ResourceReader pour lire la ressource du ResourceStream.

 foreach (string str in Application.ResourceAssembly.GetManifestResourceNames()){
txt.Text += str + "\n";
 {
  Stream st = Application.ResourceAssembly.GetManifestResourceStream(str);
  using (ResourceReader resourceReader = new ResourceReader(st))
  {
   foreach (DictionaryEntry resourceEntry in resourceReader)
   {
    txt.Text +="\t: "+ resourceEntry.Key + "\n";
   }
  }
 }
}

seconde réponse

Vous pouvez utiliser Assembly.Load() pour charger l'assembly externe et lire les dictionnaires de ressources de celui-ci.

Assembly assembly = Assembly.Load("Assembly Name String"); 
foreach (string str in assembly.GetManifestResourceNames())
{
 {
  Stream st = assembly.GetManifestResourceStream(str);
  using (ResourceReader resourceReader = new ResourceReader(st))
  {
   foreach (DictionaryEntry resourceEntry in resourceReader)
   {
    .....
   }
  }
 }
}

Vous pouvez ajouter ResourceDictionary à l'exécution.

Resources.MergedDictionaries.Add(...)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top