2009-07-26 14 views
11

Digamos que tengo el siguiente:Cómo hacer Style.Triggers desencadenan un estilo diferente llamado a aplicarse

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="BorderBrush" Value="Gray" /> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      <Setter Property="BorderBrush" Value="Green" /> 
      <Setter Property="BorderThickness" Value="2" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Esto funciona bien y no hay nada demasiado mal aquí, pero es un caso bastante sencillo . ¿Qué pasa si quiero tener el estado estilo IsFocused aparece como un estilo exsplicit cómo hacer referencia a ese estilo como el estilo IsFocused, es decir

<Style x:key="ActiveStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="BorderBrush" Value="Green" /> 
    <Setter Property="BorderThickness" Value="2" /> 
</Style> 

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="BorderBrush" Value="Gray" /> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      -- Here I want to reference ActiveStyle and not copy the copy the setters 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Respuesta

11

No creo que se puede, sin embargo, se puede volver a utilizar un estilo de esta manera:

<Style x:Key="ActiveStyle" TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      <Setter Property="BorderBrush" Value="Green" /> 
      <Setter Property="BorderThickness" Value="2" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ActiveStyle}"> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="BorderBrush" Value="Gray" /> 
</Style> 

no veo otra solución :(

+0

No es ideal Estoy de acuerdo pero tendré que hacerlo, gracias – vdhant

7

WPF está proporcionando una propiedad especial para este FrameworkElement.FocusVisualStyle Así que adelante y asignar eso :)

<TextBox FocusVisualStyle="{StaticResource ActiveStyle}" ..... 

O de otra manera utilizando emisores de

<Style TargetType="{x:Type TextBox}"> 
<Setter Property="BorderThickness" Value="1" /> 
<Setter Property="BorderBrush" Value="Gray" />  
<Setter Property="FocusVisualStyle" > 
    <Setter.Value> 
    <Style x:key="ActiveStyle" TargetType="{x:Type TextBox}"> 
     <Setter Property="BorderBrush" Value="Green" /> 
     <Setter Property="BorderThickness" Value="2" /> 
    </Style> 
    </Setter.Value> 
    </Setter> 
</Style> 
6

Hay todavía una tercera manera de hacer esto.

Cree dos plantillas de control con nombre para el control de:

<ControlTemplate x:Key="NotFocused" TargetType="{x:Type TextBox}"> 
    . . . 
</ControlTemplate> 

<ControlTemplate x:Key="Focused" TargetType="{x:Type TextBox}"> 
    . . . 
</ControlTemplate> 

A continuación, se crea un estilo predeterminado para el cuadro de texto con los disparadores en ella:

<Style TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="True"> 
      <Setter Property="Template" Value="{StaticResource Focused}" /> 
     </Trigger> 
     <Trigger Property="IsFocused" Value="False"> 
      <Setter Property="Template" Value="{StaticResource NotFocused}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

, Tony

+1

Esto causa una excepción para mí: "El objeto de estilo no puede afectar la propiedad Style del objeto al que se aplica." Es una especie de Obvio, ¿cómo puede un estilo cambiar a otro estilo pero aún así continuar trabajando? – svick

+0

Podría haber jurado que tenía un ejemplo de esto en mi aplicación, pero no puedo encontrarlo ahora. No recuerdo el error que ocurrió en mi desarrollo, que en realidad no significa nada. Tendré que jugar con esto en algún momento cuando tenga unos minutos de sobra. –

+0

@svick: He editado mi ejemplo por lo que ahora usa código que funciona. Puede no ser totalmente relevante para la pregunta original ahora, ya que utiliza plantillas de control y un estilo predeterminado. Pero esto funciona –

Cuestiones relacionadas