我可以在代码隐藏中获取样式的密钥吗? (WPF)

问题描述 投票:0回答:6

如果我有以下代码:

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

有没有办法获取样式名称(即反向查找)?比如:

string name = defaultStyle.SomeMagicLookUpFunction()

名称的计算结果为“MyTestStyle”。

这可能吗?

.net wpf styles
6个回答
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 的正确位置。如果需要,您可以向静态类添加更多方法来递归遍历窗口中的所有字典(应用程序?)


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

1
投票

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

查看关于 x:Key

的 MSDN 文档

1
投票

可能不使用 Style 对象,但如果你在包含你的样式的 ResourceDictionary 中四处寻找,你可以获得 x:Key。


0
投票
IF语句需要比较如下字符串

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

0
投票
关于

这个答案 我会在合并字典中添加一个检查,因为它们的键不存在于包含资源字典中:

public static string? FindResourceKey(ResourceDictionary dictionary, object resourceItem) { foreach (object key in dictionary.Keys) { if (dictionary[key] == resourceItem) { return key.ToString(); } } foreach (var md in dictionary.MergedDictionaries) { if(FindResourceKey(md, resourceItem) is object key) { return key.ToString(); } } return null; }
    
© www.soinside.com 2019 - 2024. All rights reserved.