2009-02-11 7 views

Respuesta

11

He creado una pequeña clase de ayuda con un único método para hacer la búsqueda inversa que necesita.

public static class ResourceHelper 
{ 
    static public string FindNameFromResource(ResourceDictionary dictionary, object resourceItem) 
    { 
     foreach (object key in dictionary.Keys) 
     { 
      if (dictionary[key] == resourceItem) 
      { 
       return key.ToString(); 
      } 
     } 

     return null; 
    } 
} 

se le puede llamar utilizando la siguiente

string name = ResourceHelper.FindNameFromResource(this.Resources, defaultStyle); 

Cada FrameworkElement tiene su propio diccionario .Resources, el uso de 'esto' supone que estás en el lugar adecuado para el que se define MyTestStyle. Si es necesario, podría agregar más métodos a la clase estática para recorrer recursivamente todos los diccionarios en una ventana (¿aplicación?)

+0

o si sólo tiene que empezar desde algún FrameworkElement y trabajar en amplitud a través de lo visual árbol. – user7116

1

Sin buscar diccionarios de recursos, no creo que esto sea posible ya que x: Key es parte de la gramática de marcado XAML y no tiene relevancia cuando se hace referencia a un Style o DataTemplate o cualquier cosa que hayas recuperado.

Tenga una mirada en el documento de MSDN en x:Key

3

Tuve que cambiar ligeramente el ejemplo anterior para que funcione, ya que utilizo MergedDictionaries. Si el ejemplo anterior le da 0 resultados, intente esto:

//Called by FindNameFromResource(aControl.Style) 
    static public string FindNameFromResource(object resourceItem) 
    { 

     foreach (ResourceDictionary dictionary in App.Current.Resources.MergedDictionaries) 
     { 
      foreach (object key in dictionary.Keys) 
      { 
       if (dictionary[key] == resourceItem) 
       { 
        return key.ToString(); 
       } 
      } 
     } 
     return null; 
    } 
0

La instrucción IF necesita para comparar cadenas de la siguiente manera

public static class ResourceHelper 
    { 
     static public string FindNameFromResource(ResourceDictionary dictionary, object resourceItem) 
     { 
      foreach (object key in dictionary.Keys) 
      { 
       if (key.Equals(resourceItem)) 
       { 
        return key.ToString(); 
       } 
      } 

      return null; 
     } 
Cuestiones relacionadas