2009-06-03 6 views
8

J'ai un style global qui définit tous mes styles TextBox, mais dans certains cas, je veux rétablir juste la couleur de premier plan à la couleur d'origine non-custom-style. J'ai essayé d'utiliser {TemplateBinding Foreground} à l'intérieur du TextBoxes spécifique que je voulais revenir. Cela ne s'est pas avéré être du XAML valide et je ne suis pas sûr que ce soit la bonne façon.Appliquer le style WPF par défaut

Des idées? Merci.

Répondre

11

Il y a plusieurs façons de le faire. Si vous regardez le Precedence List sur le MSDN alors vous pouvez voir que le jeu de Forêts des manières 1-8 remplacera le Foreground d'un style par défaut. La manière la plus simple étant simplement de définir la valeur locale dans le TextBox.

<TextBox Foreground="Red" /> 

Une autre chose que vous pouvez faire est d'utiliser la propriété 'BasedOn' de styles pour remplacer les autres versions. Cela ne nécessite de donner une valeur clé de votre style par défaut, mais peut être utilisé pour appliquer également la valeur par défaut comme dans cet exemple:

<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> 


Edit:
Dans le cas où le style par défaut est l'application d'une valeur et que vous voulez revenir à la valeur de base, il y a quelques façons que je peux penser, hors portée, pour obtenir ce comportement. Vous ne pouvez pas, que je sache, revenir à la valeur du thème par défaut de manière générique.

Nous pouvons cependant faire d'autres choses. Si nous avons besoin du style pour ne pas appliquer certaines propriétés, nous pouvons définir le style sur {x:Null}, ce qui empêche l'application du style par défaut. Ou nous pouvons donner à l'élément de son propre style qui ne hérite pas du style de base, puis réappliquer seulement les setters dont nous avons besoin:

 <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> 

Nous pourrions modifier le style par défaut de sorte que le premier plan ne sera établi à certaines conditions, telles que l'étiquette étant une certaine valeur.

<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

Dans votre exemple, je ne souhaite pas spécifier "Bleu". Je veux faire quelque chose comme . Je veux sa valeur par défaut sans dire explicitement Value = "Black". – xanadont

+0

Ah, c'est un peu différent en effet. Je vais modifier ma réponse pour gérer ce cas. – rmoore

+0

Il s'avère que mon problème était un peu différent de ce que j'ai décrit. C'était vraiment une question de style appliqué aux TextBox dans un ListView. Mais j'accepterai cette réponse pour vous donner du jus de SO puisque vous avez fait un excellent travail d'explication. Merci! – xanadont

Questions connexes