¿Cómo usar el valor de un estilo en otro estilo?
Frecuentes
Visto 106 equipos
2
Estoy tratando de crear un estilo que asegure que los ComboBoxes tengan la misma altura que los TextBoxes.
Quiero lograr esto reutilizando la altura del estilo de cuadro de texto predeterminado.
<Style TargetType="ComboBox">
<Setter Property="Height" Value="<Height from default TextBox style>" />
</Style>
¿Me estoy perdiendo algo obvio o esto no es posible?
2 Respuestas
1
Esto es lo más cerca que pude conseguir:
Style defaultStyle = (Style)Application.Current.TryFindResource(typeof(TextBox));
object o = this.GetPropertyValue(defaultStyle, "Height");
Dónde GetPropertyValue
es:
private object GetPropertyValue(Style style, string propertyName)
{
foreach (Setter s in style.Setters)
{
if (s.Property.Name == propertyName)
{
return s.Value;
}
}
if (style.BasedOn != null)
{
return GetPropertyValue(style.BasedOn, propertyName);
}
return null;
}
Esto funciona, pero fallará cuando el Style
utiliza una Template
. También podrías caminar por eso, pero dependiendo de la representación, tendrá otra altura.
Para usar esto en XAML, debe crear una clase estática que tenga una propiedad que llame a este método.
Respondido 07 Oct 14, 14:10
Como puede ver en la discusión continua con Chris debajo de la pregunta en sí, todo básicamente no tiene sentido ;-) - daniel hilgarth
1
Puede usar la propiedad BasedOn.
<Style x;Key="MyStyle" TargetType="Control">
<Setter Property="Height" Value="10" />
</Style>
<Style TargetType="TextBox" BasedOn="{StaticResource MyStyle}">
...
</Style>
<Style TargetType="ComboBox" BasedOn="{StaticResource MyStyle}">
...
</Style>
Consulte más ejemplos en MSDN: http://msdn.microsoft.com/en-us/library/system.windows.style.basedon(v=vs.110).aspx
Puede crear un estilo en el que se basará su estilo de cuadro de texto y cuadro combinado predeterminado.
Respondido 07 Oct 14, 14:10
No es lo que quiero usar. Quiero usar el valor predeterminado del estilo TextBox. Cualquiera que sea ese valor. No quiero codificarlo. Además, no quiero basar el estilo ComboBox en el estilo TextBox porque heredaría no solo la altura sino también todos los demás valores, si es posible. - daniel hilgarth
Cierto, pero los tipos son totalmente diferentes, por lo que la herencia no es posible. - patricio hofman
¿Cómo puede alguien votar esto? Esto no está ni cerca de una respuesta. - patricio hofman
@knopo: Claramente no entiendes el problema. Se trata de estilos predeterminados y de obtener una propiedad de un estilo en otro, cuando los tipos de control no coinciden. - patricio hofman
Diría que esta es una respuesta válida, es un compromiso, pero solo porque el OP ha pedido algo que no es posible. - BenjamínPaul
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# wpf xaml or haz tu propia pregunta.
@Daniel: si puede obtener el estilo predeterminado usando algo de C#, podría escribir fácilmente un
StaticResource
que accede a ella. - Patrick Hofman@PatrickHofman: Verdadera y buena idea como último recurso. Sin embargo, si es posible, me gustaría hacerlo únicamente en XAML. - Daniel Hilgarth
@DanielHilgarth: ¿Esto está relacionado? stackoverflow.com/questions/16812605/… - Patrick Hofman
@PatrickHofman: Sí, está relacionado, pero no estoy seguro de que esté funcionando en mi caso. - Daniel Hilgarth
¿Por qué no convertir la altura en un recurso (p. ej.;
<System:Double x:Key="SharedHeight">50</System:Double>
) que cargarlo en ambos a través de<Setter Property="Height" Value="{StaticResource SharedHeight}"/>
ya que lo estás nombrando en uno explícitamente de todos modos? - Chris W.