2009-06-03 15 views
8

Mam styl globalny, który ustawia wszystkie moje style TextBox, ale w niektórych przypadkach chcę przywrócić tylko kolor pierwszego planu do oryginalnego koloru niestandardowego. Próbowałem używać {TemplateBinding Foreground} wewnątrz konkretnej TextBoxes, którą chciałem przywrócić. To nie okazało się prawidłowym XAML i nie jestem pewny, czy to prawda.Zastosuj domyślny styl WPF

Wszelkie pomysły? Dzięki.

Odpowiedz

11

Można to zrobić na kilka sposobów. Jeśli spojrzysz na numer Precedence List na MSDN , to zobaczysz, że zestaw Forground w sposób 1-8 zastąpi Foreground ze standardowego stylu. Najprostszym sposobem jest ustawienie lokalnej wartości w TextBox.

<TextBox Foreground="Red" /> 

Inną rzeczą, którą można zrobić, to użyć właściwości stylów 'BasedOn' przesłonić inne wersje. To wymaga podania wartości klucza do stylu domyślnego, ale które mogą być następnie wykorzystane również zastosować domyślne jak w poniższym przykładzie:

<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:
W przypadku, gdy domyślny styl stosuje wartość i chcesz ją przywrócić do wartości bazowej, istnieje kilka sposobów, które mogę wymyślić, z ręki, aby uzyskać to zachowanie. Nie można, o czym wiem, powrócić do domyślnej wartości kompozycji w sposób ogólny.

Możemy jednak zrobić kilka innych rzeczy. Jeśli potrzebujemy stylu, aby nie stosować niektórych właściwości, możemy ustawić styl na {x:Null}, zatrzymując w ten sposób stosowanie stylu domyślnego. Albo możemy nadać elementowi to własnego stylu, który nie dziedziczy od stylu bazowego, a następnie ponownie ubiegać tylko ustawiające, które musimy:

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

Możemy zmodyfikować domyślny styl, dzięki czemu zostaną ustawione tylko Planie pod pewnymi warunkami, takimi jak znacznik będący określoną wartością.

<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

W twoim przykładzie nie chcę określać "Niebieski". Chcę zrobić coś jak . Chcę, aby jego domyślne w/o jawnie mówiąc Wartość = "Czarny". – xanadont

+0

Ah, to trochę inaczej. Zmienię moją odpowiedź, aby poradzić sobie z tą sprawą. – rmoore

+0

Okazało się, że mój problem był trochę inny niż to, co opisałem. To było naprawdę kwestia stylizacji zastosowanej do TextBoxów w ListView. Ale przyjmuję tę odpowiedź, aby dać ci trochę soku SO, odkąd wykonałeś tak wspaniałą pracę wyjaśniając. Dzięki! – xanadont

Powiązane problemy