2009-06-03 17 views
8

Tengo un estilo global que establece todos mis estilos TextBox, pero en algunos casos quiero revertir solo color de primer plano al color original no personalizado. Intenté usar {TemplateBinding Foreground} dentro del específico TextBoxes que quería revertir. No terminó siendo XAML válido y no estoy seguro de que sea la manera correcta de todos modos.Aplicar estilo WPF predeterminado

¿Alguna idea? Gracias.

Respuesta

11

Hay algunas maneras en que esto se puede hacer. Si nos fijamos en el Precedence List en el MSDN , entonces puede ver que el conjunto Forground de las formas 1-8 anulará el Foreground desde un estilo predeterminado. La forma más fácil es simplemente establecer el valor local en TextBox.

<TextBox Foreground="Red" /> 

Otra cosa que puedes hacer es usar la propiedad 'BasedOn' de estilos para anular las otras versiones. Esto requiere dar un valor clave para su estilo por defecto, pero que luego se puede utilizar para aplicar la opción por defecto como en este ejemplo:

<Style TargetType="{x:Type TextBox}" 
      x:Key="myTextBoxStyle"> 
     <Setter Property="Foreground" 
       Value="Red" /> 
     <Setter Property="FontWeight" 
       Value="Bold" /> 
    </Style> 
    <!-- Style applies to all TextBoxes --> 
    <Style TargetType="{x:Type TextBox}" 
      BasedOn="{StaticResource myTextBoxStyle}" /> 


<TextBox Text="Hello"> 
    <TextBox.Style> 
     <Style BasedOn="{StaticResource myTextBoxStyle}" TargetType="{x:Type TextBox}"> 
      <Setter Property="Foreground" 
        Value="Blue" /> 
     </Style> 
    </TextBox.Style> 
</TextBox> 


Editar:
En el caso de que el estilo por defecto está aplicando un valor y desea revertirlo al valor base, hay algunas formas en que se me ocurre, de forma manual, para obtener este comportamiento. No se puede, que yo sepa, enlazar de nuevo al valor predeterminado del tema de una manera genérica.

Sin embargo, podemos hacer otras cosas. Si necesitamos el estilo para no aplicar algunas propiedades, podemos establecer el estilo en {x:Null}, deteniendo así la aplicación del estilo predeterminado. O podemos dar al elemento un estilo propio que no hereda del estilo de base y luego volver a aplicar sólo los emisores que necesitamos:

 <TextBox Text="Hello" Style="{x:Null}" /> 
     <TextBox Text="Hello"> 
      <TextBox.Style> 
       <Style TargetType="{x:Type TextBox}"> 
        <Setter Property="FontWeight" 
          Value="Bold" /> 
       </Style> 
      </TextBox.Style> 
     </TextBox> 

Podríamos modificar el estilo por defecto de forma que sólo se establecerá el primer plano bajo ciertas condiciones, como que la Etiqueta tenga un cierto valor.

<Style TargetType="{x:Type TextBox}" 
      x:Key="myTextBoxStyle"> 
     <Setter Property="FontWeight" 
       Value="Bold" /> 
     <Style.Triggers> 
      <Trigger Property="Tag" 
        Value="ApplyForeground"> 
       <Setter Property="Foreground" 
         Value="Red" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

    <TextBox Text="Hello" /> 
    <TextBox Text="Hello" Tag="ApplyForeground" /> 
+1

En su ejemplo, no quiero tener que especificar "Azul". Quiero hacer algo como . Quiero su valor predeterminado sin decir explícitamente Valor = "Negro". – xanadont

+0

Ah, eso es un poco diferente. Editaré mi respuesta para manejar ese caso. – rmoore

+0

Resulta que mi problema era un poco diferente de lo que describí. Fue realmente una cuestión de estilo aplicado a TextBoxes en un ListView. Pero aceptaré esta respuesta para darle un poco de jugo de SO, ya que hizo un gran trabajo explicando. ¡Gracias! – xanadont

Cuestiones relacionadas