redondeados redondeado plantillas estilos botones boton .net wpf styles

.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?



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