2009-03-13 17 views
31

Je souhaite utiliser le style de la zone de texte Aero, mais remplace certaines propriétés. J'essaie d'y arriver par:Remplacer le style par défaut dans WPF TextBox, basé sur 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> 

Cependant, il en résulte un StackOverflowException lors du démarrage de mon application. Lorsque je supprime la référence à PresentationFramework.Aero, cela fonctionne, mais je reçois le style de système d'exploitation par défaut, ce qui rend l'application moche. Donc, en effet: si je veux remplacer un style sur toutes mes boîtes de texte, je ne peux pas obtenir le look Aero. Si je veux l'apparence Aero, je ne peux pas remplacer n'importe quel style. Impasse.

Un moyen de résoudre ce problème?

+0

Dans votre commentaire réponse Roberts ci-dessous vous semblez insinuer que vous avez obtenu ce travail avec resourcedictionaries haut niveau. S'il vous plaît partagez ce que vous avez trouvé. – Oskar

Répondre

35

Il semble fonctionner si vous mettez le Style comme une ressource de niveau inférieur, au lieu de la même 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

Super, ça marche. J'ai mis les styles dans un autre ResourceDictionary au même niveau du dictionnaire externe, et le StackOverflow a disparu. Merci! – Inferis

+5

Merci pour cette réponse, mais y at-il de toute façon pour que cela fonctionne avec l'Aero resourcedictionary et mes propres styles définis dans Application.Resources (App.xaml)? Je ne peux vraiment pas me permettre de placer ceci sur par exemple chaque fenêtre .. – Oskar

12

Contrairement au code réponse acceptée celui-ci permet d'utiliser le dictionnaire de ressources pour les styles. Effrontément volé http://social.msdn.microsoft.com/forums/en-US/wpf/thread/3c66adb7-fd26-40c7-8404-85f6fefbd392/ répondu 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}"/>