Могу ли я получить ключ стиля в коде позади? (WPF) - PullRequest
12 голосов
/ 11 февраля 2009

Если у меня есть следующий код:

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

Есть ли способ получить название стиля (то есть обратный поиск)? Что-то вроде:

string name = defaultStyle.SomeMagicLookUpFunction()

Где имя будет оцениваться как "MyTestStyle."

Возможно ли это?

Ответы [ 5 ]

12 голосов
/ 12 февраля 2009

Я создал небольшой вспомогательный класс с одним методом для обратного поиска, который вам необходим.

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 голосов
/ 13 мая 2010

Мне пришлось немного изменить приведенный выше пример, чтобы он работал, потому что я использую 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 голос
/ 12 февраля 2009

Возможно, вы не используете объект Style, но если вы попадаете в ResourceDictionary , содержащий ваш стиль , вы можете получить x: Key.

1 голос
/ 12 февраля 2009

Без поиска по словарям ресурсов я не думаю, что это возможно, так как x: Key является частью грамматики разметки XAML и не имеет никакого отношения, когда у вас есть ссылка на Style или DataTemplate или что-то полученное вами.

Посмотрите на документ MSDN на x: ключ

0 голосов
/ 29 августа 2017

Оператор 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;
        }
...