Могу ли я получить ключ от стиля в коде? (WPF)
Если у меня есть следующий код:
Style defaultStyle = (Style)FindResource("MyTestStyle");
Есть ли способ получить имя стиля (т.е. обратный поиск)? Что-то вроде:
string name = defaultStyle.SomeMagicLookUpFunction()
Где имя будет оцениваться как "MyTestStyle".
Возможно ли это?
Ответы
Ответ 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
Ответ 4
Возможно, вы не используете объект Style, но если вы перейдете в ResourceDictionary, содержащий ваш стиль, вы можете получить 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;
}