Frage

Ich erstelle eine WPF -Anwendung, in der mehrere Skins von unserem Build -System eingestuft werden. Idealerweise möchten wir, dass die Anwendung die verfügbaren Skins auflistet, da einige Builds einen bis zu vielen Skins haben.

Gibt es zur Laufzeit eine Möglichkeit, alle Ressourcenwörterbücher in einem bestimmten Ordner aufzählen?

Ich möchte es vermeiden, die XAML -Dateinamen in meinem Codebehind zu kodieren, da dies eine sich ändernde Situation ist.

War es hilfreich?

Lösung

Art von.

Sie können alle BAML -Dateien (kompilierte XAML) wie folgt aufzählen:

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

Es gibt keine Möglichkeit zu wissen, welche davon Hörwesen sind und welche anderen XAML wie Windows oder UserControls sind, ohne sie tatsächlich zu laden. Die Antwort auf Ihre direkte Frage lautet also "Nein", es sei denn, Sie laden jeden XAML, den Sie finden, um zu überprüfen, ob es sich um ein Ressourcenschutz handelt. Das wäre sehr langsam.

Wenn Sie andererseits bereit sind, ein Namensschema für Ihre Ressourcen zu verwenden, können Sie alle BAMLs in Ihrer Versammlung aufzählen und auswählen, was Ihrem Namensschema entspricht, und vertrauen, dass sie Ressourcen sind. Erweitern Sie einfach die "Wo" -Klausel in der obigen Abfrage.

Daher lautet die Antwort "irgendwie".

Andere Tipps

Hier ist eine Lösung, die ich @ microsoft gefunden habe

WPF wickelt die ResourceDictionary In der "Assembly.g.Resources" können wir den Ressourcennamen "Assembly.g.Resources" von erhalten GetManifestResourceNames(). Danach können wir verwenden ResourceReader Klasse, um die Ressource aus dem zu lesen 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";
   }
  }
 }
}

Zweite Antwort

Sie können verwenden Assembly.Load() So laden Sie die externe Baugruppe und lesen Sie die Ressourcenwörterbücher daraus.

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)
   {
    .....
   }
  }
 }
}

Sie können zur Laufzeit zur Ressourcenpflege hinzufügen.

Resources.MergedDictionaries.Add(...)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top