Pregunta

Estoy creando una aplicación WPF que tendrá varias máscaras marcadas por nuestro sistema de compilación.Lo ideal sería que la aplicación enumerara las máscaras disponibles, ya que algunas compilaciones tendrán de una a muchas máscaras.

En tiempo de ejecución, ¿hay alguna forma de enumerar todos los diccionarios de recursos en una carpeta específica?

Quiero evitar codificar los nombres de archivos XAML en mi código subyacente, ya que esta es una situación cambiante.

¿Fue útil?

Solución

Una especie de.

Puede enumerar todos los archivos BAML (XAML compilado) de la siguiente manera:

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

No hay manera de saber cuáles de estos son ResourceDictionaries y que son otros XAML como Windows o UserControls sin tener que cargarlas. Así que la respuesta a su pregunta directa es "no" a menos que se carga cada XAML que encuentre para comprobar si se trata de un ResourceDictionary. Esto sería muy lento.

Por otro lado, si usted está dispuesto a utilizar un esquema de nombres para sus ResourceDictionaries, entonces se puede enumerar todas BAMLs en su montaje y seleccionar lo que coincide con el esquema de denominación, y confiar en que son ResourceDictionaries. Sólo extender la cláusula de "donde" en la consulta anterior.

Por lo tanto la respuesta es "más o menos."

Otros consejos

Aquí hay una solución que encontré en Microsoft.

WPF envuelve el ResourceDictionary en "Assembly.g.resources", podemos obtener el nombre del recurso "Assembly.g.resources" mediante GetManifestResourceNames().Después de eso podemos usar ResourceReader clase para leer el recurso del 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";
   }
  }
 }
}

segunda respuesta

Puedes usar Assembly.Load() para cargar el ensamblado externo y leer los diccionarios de recursos del mismo.

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

Puede añadir ResourceDictionary en tiempo de ejecución.

Resources.MergedDictionaries.Add(...)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top