12

次のコードがある場合:

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

スタイルの名前を取得する方法(つまり、逆ルックアップ)はありますか?何かのようなもの:

string name = defaultStyle.SomeMagicLookUpFunction()

名前が「MyTestStyle」と評価される場所。

これは可能ですか?

4

5 に答える 5

12

必要な逆引き参照を行う単一のメソッドを持つ小さなヘルパー クラスを作成しました。

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

次を使用して呼び出すことができます

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

すべてFrameworkElementに独自の.Resources辞書があり、「this」を使用すると、MyTestStyle が定義されている適切な場所にいると見なされます。必要に応じて、静的クラスにメソッドを追加して、ウィンドウ内のすべての辞書を再帰的に走査することができます (アプリケーション?)

于 2009-02-11T23:48:05.357 に答える
3

MergedDictionaries を使用しているため、上記の例を少し変更して機能させる必要がありました。上記の例で結果が 0 の場合は、次のことを試してください。

  //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;
    }
于 2010-05-13T17:38:47.487 に答える
1

おそらくStyleオブジェクトを使用していませんが、スタイルを含むResourceDictionaryで困惑している場合は、x:Keyを取得できます。

于 2009-02-11T22:37:27.773 に答える
1

x:Key は XAML マークアップ文法の一部であり、Style や DataTemplate、または取得したものへの参照がある場合は関係がないため、リソース ディクショナリを検索しないと、これは不可能だと思います。

x:Keyの MSDN ドキュメントを見てください。

于 2009-02-11T22:16:30.133 に答える