2009-06-03 7 views
8

У меня есть глобальный стиль, который устанавливает все мои стили TextBox, но в некоторых случаях я хочу вернуть только цвет переднего плана в исходный цвет нестандартного стиля. Я попытался использовать {TemplateBinding Foreground} внутри конкретного TextBoxes, который я хотел бы вернуть. Это не стало действительным XAML, и я не уверен, что это так.Применить стиль WPF по умолчанию

Любые идеи? Благодарю.

ответ

11

Существует несколько способов сделать это. Если вы посмотрите на Precedence List на MSDN , вы увидите, что набор Forground, установленный способами 1-8, переопределит Foreground по умолчанию. Самый простой способ - просто установить локальное значение в TextBox.

<TextBox Foreground="Red" /> 

Другое дело, что вы можете сделать, это использовать 'BasedOn' свойство стилей, чтобы переопределить другие версии. Это требует давая ключевое значение для вашего стиля по умолчанию, но может быть использован также применять по умолчанию, как в этом примере:

<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:
В случае, стиль по умолчанию применяет значение, и вы хотите вернуть его к базовому значению, я могу придумать несколько способов, чтобы получить это поведение. Вы не можете, я знаю, привязать обратно к значению темы по умолчанию в общем виде.

Однако мы можем делать некоторые другие вещи. Если нам нужен стиль, чтобы не применять некоторые свойства, мы можем установить стиль на {x:Null}, тем самым прекратив применение стиля по умолчанию. Или мы можем дать элемент это собственный стиль, который не наследует от базового типа, а затем повторно применять только сеттеры, которые нам нужны:

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

Мы могли бы изменить стиль по умолчанию, так что цвет переднего плана будет установлен только на определенных условиях, таких как тег, являющийся определенным значением.

<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

В вашем примере я не хочу указывать «синий». Я хочу сделать что-то вроде . Я хочу, чтобы его значение по умолчанию не было явно указано Value = "Black". – xanadont

+0

А, это немного по-другому. Я отредактирую свой ответ, чтобы обработать этот случай. – rmoore

+0

Оказывается, мой вопрос немного отличался от того, что я описал. Это действительно вопрос стиля, который применяется к TextBoxes в ListView. Но я приму этот ответ, чтобы дать вам сок SO, так как вы проделали такую ​​большую работу, объясняя. Благодаря! – xanadont

Смежные вопросы