2009-03-13 16 views
31

Quiero utilizar el estilo de cuadro de texto Aero, pero todavía anulo algunas propiedades. Trato de lograr esto:Reemplazar el estilo predeterminado en WPF TextBox, basado en PresentationFramework.Aero

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 

    <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
     <Setter Property="Margin" Value="2" /> 
     <Setter Property="Padding" Value="2" /> 
    </Style> 
</ResourceDictionary> 

Sin embargo, esto resulta en una StackOverflowException al iniciar mi aplicación. Cuando elimino la referencia a PresentationFramework.Aero, esto funciona pero obtengo el estilo de sistema operativo predeterminado, lo que hace que la aplicación sea fea. ;)

Por lo tanto, en efecto: si quiero sobrescribir algún estilo en todos mis cuadros de texto no puedo obtener el aspecto Aero. Si quiero el aspecto Aero, no puedo anular ningún estilo. Punto muerto.

¿Alguna manera de resolver esto?

+0

En su comentario a continuación Roberts respuesta que parece dar a entender que tienes este trabajo con resourcedictionaries de alto nivel. Por favor comparte lo que se te ocurrió. – Oskar

Respuesta

35

parece que funciona si pones el Style como un recurso de nivel inferior, en lugar de en la misma ResourceDictionary:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Grid.Resources> 
    <Border BorderBrush="Blue" BorderThickness="3"> 
     <Border.Resources> 
      <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
       <Setter Property="Margin" Value="2" /> 
       <Setter Property="Padding" Value="2" /> 
      </Style> 
     </Border.Resources> 
     <TextBox /> 
    </Border> 
</Grid> 
+0

Genial, eso funciona. Puse los estilos en otro ResourceDictionary en el mismo nivel del diccionario externo, y StackOverflow desapareció. ¡Gracias! – Inferis

+5

Gracias por esta respuesta, pero ¿hay alguna forma de que esto funcione tanto con el aeroourouricictionary como con mis propios estilos definidos en Application.Resources (App.xaml)? Realmente no puedo permitirme colocar esto, por ejemplo, en cada ventana ... – Oskar

12

A diferencia del código en respuesta aceptada ésta permite el uso de diccionario de recursos para los estilos. robado descaradamente de http://social.msdn.microsoft.com/forums/en-US/wpf/thread/3c66adb7-fd26-40c7-8404-85f6fefbd392/ respondida por Vivien Ruitz

<!--App.xaml--> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/MyAppli;component/Resources/Themes/StyleDictionary.xaml"/> 
      <ResourceDictionary Source="/MyAppli;component/Resources/Themes/ApplyStyleDictionary.xaml"/> 
      ... 
     </ResourceDictionary.MergedDictionaries> 

<!--StyleDictionary.xaml--> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <Style x:Key="ButtonStyleToApply" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" > 
      ... <!--Extend the aero style here--> 
     </Style> 

<!--ApplyStyleDictionary.xaml--> 
     <Style TargetType="Button" BasedOn="{StaticResource ButtonStyleToApply}"/>