我可以在代码隐藏中获得样式的关键吗? (WPF)

时间:2009-02-11 20:58:10

标签: .net wpf styles

如果我有以下代码:

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

有没有办法获得样式的名称(即反向查找)?类似的东西:

string name = defaultStyle.SomeMagicLookUpFunction()

名称将评估为“MyTestStyle。”

这可能吗?

5 个答案:

答案 0 :(得分: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的定义位置正确。如果需要,您可以向静态类添加更多方法,以递归方式遍历窗口中的所有字典(应用程序?)

答案 1 :(得分: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;
    }

答案 2 :(得分:1)

在不搜索资源字典的情况下,我认为这不可能,因为x:Key是XAML标记语法的一部分,并且在您引用Style或DataTemplate或您检索的任何内容时没有相关性。

查看x:Key

上的MSDN文档

答案 3 :(得分:1)

可能没有使用Style对象,但是如果你在ResourceDictionary containing your style中徘徊,你可以获得x:Key。

答案 4 :(得分:0)

IF语句需要比较字符串,如下所示

{{1}}