.net - plantillas - botones redondeados en wpf
¿Puedo obtener la clave de un estilo en código subyacente?(WPF) (5)
Creé una pequeña clase de ayuda con un único método para hacer la búsqueda inversa que necesita.
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;
}
}
puede llamarlo usando lo siguiente
string name = ResourceHelper.FindNameFromResource(this.Resources, defaultStyle);
Cada FrameworkElement
tiene su propio diccionario .Resources
, usando ''this'' supone que estás en el lugar correcto para donde está definido MyTestStyle. Si es necesario, podría agregar más métodos a la clase estática para recorrer recursivamente todos los diccionarios en una ventana (¿aplicación?)
Si tengo el siguiente código:
Style defaultStyle = (Style)FindResource("MyTestStyle");
¿Hay alguna manera de obtener el nombre del estilo (es decir, búsqueda inversa)? Algo como:
string name = defaultStyle.SomeMagicLookUpFunction()
Donde el nombre se evaluaría como "MyTestStyle".
es posible?
Probablemente no use el objeto Style, pero si va por el ResourceDictionary que contiene su estilo , puede obtener la clave x :.
Sin buscar diccionarios de recursos, no creo que esto sea posible ya que x: Key es parte de la gramática de marcado XAML y no tiene relevancia cuando tienes una referencia a un estilo o DataTemplate o cualquier cosa que hayas recuperado.
Eche un vistazo al documento de MSDN en x: Clave
Tuve que cambiar ligeramente el ejemplo anterior para que funcione, ya que uso MergedDictionaries. Si el ejemplo anterior te da 0 resultados, prueba esto:
//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;
}
La instrucción IF necesita comparar cadenas como se muestra a continuación
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;
}