Подтвердить что ты не робот

Могу ли я получить ключ от стиля в коде? (WPF)

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

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

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

string name = defaultStyle.SomeMagicLookUpFunction()

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

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

4b9b3361

Ответ 1

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

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. Если нужно, вы можете добавить больше методов для статического класса для рекурсивного прохождения всех словарей в окне (приложение?)

Ответ 2

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

Ответ 3

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

Взгляните на документ MSDN на x: Key

Ответ 5

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