2011-04-15 16 views
11

Tengo un tema que se aplica a todos los botones en un diccionario de recursos. Ahora quiero agregar un disparador al botón mientras heredo los cambios de estilo del diccionario. Probé el siguiente código:basar un estilo en otro estilo en un diccionario de recursos

pero dice que no se puede encontrar el control. ¿Cómo puedo solucionarlo?

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Theme.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 

     <conv:ErrorContentConverter x:Key="ErrorContentConverter" /> 

     <Style x:Key="ValidTrigger" 
      TargetType="Control" BasedOn="{StaticResource {x:Type Control}}" > 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=IsValid}" Value="False"> 
       <Setter Property="IsEnabled" Value="false" /> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </ResourceDictionary> 
</UserControl.Resources> 

y la plantilla base:

<Style TargetType="{x:Type Button}" BasedOn="{x:Null}"> 
    <Setter Property="FocusVisualStyle" 
      Value="{DynamicResource NuclearButtonFocusVisual}" /> 
    <Setter Property="Foreground" Value="#FF042271" /> 
    <Setter Property="FontFamily" Value="Trebuchet MS" /> 
    <Setter Property="FontSize" Value="12" /> 
    <Setter Property="Padding" Value="3" /> 

    <Setter Property="Template" Value="{DynamicResource ButtonTemplate}" /> 
</Style> 

Respuesta

12

Dé su estilo base de un nombre, decir FooStyle.

En el ejemplo que diste, modifique el TargetType y BasedOn para buscar la siguiente manera:

<Style x:Key="ValidTrigger" 
     TargetType="{x:Type Control}" BasedOn="{StaticResource {x:Type Control}}" > 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=IsValid}" Value="False"> 
      <Setter Property="IsEnabled" Value="false" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

¿Puedo hacerlo sin asignar un nombre? Solo hay un estilo para el control en el diccionario. – Marcom

+0

¿Quiere decir que, en lugar de asignar una clave al estilo base, le gustaría que el estilo extendido determine qué estilo extender según su TargetType? No lo sé. –

+0

¿Por qué dudar en darle al estilo base una x: Key = "FooStyle"? –

0

StaticResource vs DynamicResource

que desea utilizar DynamicResource en lugar de StaticResource. Su aplicación se compilará y el recurso se resolverá en tiempo de ejecución en lugar de en tiempo de compilación. Solía ​​ser que DynamicResource tendría un mayor costo de rendimiento en los viejos días de WPF, pero ahora parece no tener problemas. Quiero decir, diablos, Expression Blend está escrito en WPF y usa DynamicResources en todas partes.


P.S. Tenga en cuenta que si realmente no define un nombre de recurso, su aplicación seguirá ejecutándose, pero en su caso faltaría funcionalidad. :)

+0

Parece que esto no se puede hacer, lo intenté pero descubrí que DynamicRecource solo se puede usar con propiedades de dependencia. – Zmaster

1

Creo que no hay un estilo base definido para "control" por lo que su parte BasedOn="{StaticResource {x:Type Control}}" no encontrará nada.

Es posible que desee cambiar

<Style x:Key="ValidTrigger" TargetType="Control" BasedOn="{StaticResource {x:Type Control}}" > 

a

<Style x:Key="ValidTrigger" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" > 
10

Un truco que he utilizado en el pasado: en su ResourceDictionary que define estilos manta para su aplicación, añadir una a la x:Key estilo del que le gustaría heredar, como por ejemplo:

<Style TargetType="{x:Type Button}" x:Key="ButtonStyle"> 
    <!-- your style here --> 
</Style> 

Para aplicar th es el estilo a todos los controles del tipo especificado (Button en este ejemplo) sin tener que establecer explícitamente el atributo Style de cada Button, añadir otro estilo que es BasedOn este estilo, pero no tiene una clave:

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyle}" /> 

Con este método, todos los Button s en su aplicación heredarán automáticamente su estilo personalizado, pero aún puede crear estilos adicionales BasedOn la entrada ButtonStyle y evitará que desaparezca todo su estilo personalizado.

Cuestiones relacionadas