¿Cómo usar el valor de un estilo en otro estilo?

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?

preguntado Oct 07 '14, 14:10

@Daniel: si puede obtener el estilo predeterminado usando algo de C#, podría escribir fácilmente un StaticResource que accede a ella. -

@PatrickHofman: Verdadera y buena idea como último recurso. Sin embargo, si es posible, me gustaría hacerlo únicamente en XAML. -

@DanielHilgarth: ¿Esto está relacionado? stackoverflow.com/questions/16812605/… -

@PatrickHofman: Sí, está relacionado, pero no estoy seguro de que esté funcionando en mi caso. -

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

2 Respuestas

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

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 or haz tu propia pregunta.