2010-12-21 11 views
4

Mein Problem tritt mit WPF in .NET 3.5 SP1 und kann wie folgt beschrieben werden:Standard TextBlock- Stil überwiegende Schaltfläche Textfarbe

Ich habe einen Style Standard trifft alle TextBlock Elemente in meinem UI. Das ist, wie es aussieht:

<Style TargetType="{x:Type TextBlock}"> 
    <Setter Property="TextTrimming" Value="CharacterEllipsis"/> 
    <Setter Property="Foreground" Value="Red"/> 
</Style> 

, die für alle TextBlock s gut funktioniert. Zusätzlich zu, dass ich eine Button Stil mit einem ControlTemplate, die wie dieser (verkürzt) aussieht:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}" BasedOn="{x:Null}"> 
    <Setter Property="Foreground" Value="Green"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Border x:Name="Border" 
        Background="{TemplateBinding Background}" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        Padding="{TemplateBinding Padding}" 
        Height="24" 
        BorderBrush="{TemplateBinding BorderBrush}"> 
       <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
           TextBlock.Foreground="{TemplateBinding Foreground}"/> 
      </Border> 
      <ControlTemplate.Triggers>...</ControlTemplate.Triggers> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Beachten Sie die Linie TextBlock.Foreground="{TemplateBinding Foreground}" im ContentPresenter. Dies sollte den Schaltflächentext auf grün setzen und tatsächlich in der Designer-Ansicht von Visual Studio. Aber wenn ich das Programm kompiliere und laufe, ist der Knopftext rot, die Textfarbe wird durch den Standard-Stil TextBlock eingestellt. Das habe ich mit Snoop verifiziert.

Wie kann ich verhindern, dass der Standard TextBlock den Wert TextBlock.Foreground überschreibt? Die OverridesDefaultStyle Eigenschaft von ContentPresenter hilft in diesem Fall nicht.

Irgendeine Idee?

Antwort

10

Siehe Antwort 5 bei this link

Diese happends weil die Content einen Textblock erzeugt für einen String Inhalt, und da diese TextBlock- nicht in der visuellen Struktur ist, es wird Nachschlag auf Anwendungsebene Ressource. Und wenn Sie einen Stil für den Textblock auf Anwendungs ​​ Ebene definieren, dann wird es zu diese TextBlock- innerhalb Content angewendet werden

Eine Abhilfe ist ein Datatemplate für System.String zu definieren, wo wir ausdrücklich ein verwenden können Standard TextBlock, um den Inhalt anzuzeigen. Sie können diese Datatemplate platzieren im gleichen Wörterbuch Sie die TextBlock- Stil definieren, so dass diese Datatemplate wird was Content erfolgt durch Stil angewendet werden.

versuchen, dies zu dem Resource Zugabe

<DataTemplate DataType="{x:Type sys:String}"> 
    <TextBlock Text="{Binding}"> 
     <TextBlock.Resources> 
      <Style TargetType="{x:Type TextBlock}"/> 
     </TextBlock.Resources> 
    </TextBlock> 
</DataTemplate> 
+2

Dank für Ihre Antwort danken. Es gibt zwei Dinge, die ich nicht verstehe: 1. Auch wenn der TextBlock, der vom ContentPresenter erstellt wurde, nicht im VisualTree ist, sollte er trotzdem die Werte akzeptieren, die ich in TextBlock.Foreground eingegeben habe, richtig? 2. Mit dem von Ihnen beschriebenen DataTemplate bin ich für alle Texte in ContentPresenter-Elementen auf nur einen Stil beschränkt, richtig? –

+0

@HA: Wie ich es verstehe, wird es nur sicherstellen, dass der andere TextBlock Stil nicht aufgestockt ist.Aber ich könnte mich irren, ich habe es vorher benutzt und ich hatte keine Probleme damit –

+0

@HA: Auch das wird nur verwendet, wenn ein TextBlock aufgrund des Inhalts eines ContentControl erstellt wird. Sie können immer noch die Dinge tun, die Sie in Ihrem Beispiel tun, wie zum Beispiel den Vordergrund setzen. Oder missverstehe ich die Frage? –

4

Sie sind besser für den Textblock nicht zwingenden Standardstil. Die beste Idee, die ich mir bisher vorstellen konnte, ist, einen Stil für Control zu erstellen und auf alle Top-Level-Fenster anzuwenden.

<!-- App.xaml --> 
<Application.Resources> 
    <Style x:Key="RedStyle" TargetType="{x:Type Control}"> 
     <Setter Property="TextTrimming" Value="CharacterEllipsis"/> 
     <Setter Property="Foreground" Value="Red"/> 
    </Style> 
</Application.Resources> 

<!-- MainWindow.xaml --> 
<Window Style="{StaticResource RedStyle}" ...> 
    ... 
</Window> 

Sehen Sie hier für weitere Informationen: http://www.ikriv.com/dev/dotnet/wpftextstyle/

Verwandte Themen