2009-02-11 3 views
12

Se ho il seguente codice:Posso ottenere la chiave di uno stile in code-behind? (WPF)

Style defaultStyle = (Style)FindResource("MyTestStyle"); 

C'è un modo per ottenere il nome dello stile (vale a dire ricerca inversa)? Qualcosa di simile:

string name = defaultStyle.SomeMagicLookUpFunction() 

Dove nome dovrebbe valutare a "MyTestStyle".

È possibile?

risposta

11

Ho creato una piccola classe di supporto con un singolo metodo per eseguire la ricerca inversa richiesta.

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

si può chiamare usando il seguente

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

Ogni FrameworkElement ha il proprio dizionario .Resources, usando 'questo' presuppone che sei nel posto giusto per cui è definito MyTestStyle. Se necessario, puoi aggiungere più metodi alla classe statica per scorrere tutti i dizionari in una finestra (applicazione?)

+0

O semplicemente farlo iniziare da qualche FrameworkElement e lavorare in ampiezza attraverso il visivo albero. – user7116

1

Senza cercare dizionari di risorse, non penso sia possibile in quanto x: Key fa parte della grammatica di markup XAML e non ha rilevanza quando si ha un riferimento a uno Style o DataTemplate o qualsiasi cosa che si è recuperata.

Dai un'occhiata alla il documento MSDN su x:Key

3

Ho dovuto modificare leggermente l'esempio sopra per farlo funzionare, poiché utilizzo MergedDictionaries. Se l'esempio precedente si dà 0 risultati, provate questo:

//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

L'istruzione IF ha bisogno di confrontare le stringhe, come di seguito

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; 
     } 
Problemi correlati