2009-06-05 8 views
1

Hier ist mein XAML für ein TabItem. Ich möchte die Farbe eines einzelnen Gradientenstopps in einem Trigger festlegen können. Ich weiß, dass ich den Farbverlauf im Trigger-Setter vollständig neu definieren kann, aber ich möchte auf eine bestimmte Eigenschaft im Hintergrund zugreifen, damit ich sie in Zukunft animieren kann.WPF ControlTemplate Stil GradientStop in Trigger

Ich habe jede Variation von allem im Trigger-Setter versucht und googelte für eine lange Zeit - aber ich kann es immer noch nicht kompilieren. Ich habe auch class.property Syntax versucht, aber immer noch nichts. Der aktuelle Fehler, der durch diesen Code ausgelöst wird, ist:

"Type 'Background.GradientStops [0]' wurde nicht gefunden."

Ich bin mir ziemlich sicher, dass ich weiß, was hier vor sich geht - und vielleicht ist das, was ich will, unmöglich. Aber es muss eine Möglichkeit geben, den Gradient eines Steuerelements in einer Kontrollschablone zu animieren ...

Kann mir jemand helfen? dank

<Style TargetType="{x:Type TabItem}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <TextBlock Padding="6 2 6 2" Name="TheHeader"> 
        <TextBlock.Background> 
         <LinearGradientBrush StartPoint="0, 0" EndPoint="0, 1"> 
          <GradientStop Offset="0" Color="#f4fafd" /> 
          <GradientStop Offset="1" Color="#ceedfa" /> 
         </LinearGradientBrush> 
        </TextBlock.Background> 
        <ContentPresenter ContentSource="Header" Margin="0" /> 
       </TextBlock> 
       <ControlTemplate.Triggers > 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter TargetName="TheHeader" Property="Background.GradientStops[0].Color" Value="White" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Antwort

1

Sie können es animieren, wie im Beispiel here.

Sie könnten auch einen leichten Hack verwenden, um es zu setzen, obwohl ich es immer bevorzuge, mehrere Pinsel als Ressourcen zu erstellen und sie zu tauschen oder einen Pinsel in der von Ihnen erwähnten Weise neu zu erstellen.

<Style TargetType="{x:Type TabItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TabItem}"> 
        <TextBlock Padding="6 2 6 2" 
           Name="TheHeader" Tag="#f4fafd"> 
            <TextBlock.Background> 
              <LinearGradientBrush StartPoint="0, 0" 
                   EndPoint="0, 1"> 
                <GradientStop Offset="0" 
                    Color="{Binding ElementName=TheHeader, Path=Tag}"/> 
                <GradientStop Offset="1" 
                    Color="#ceedfa" /> 
              </LinearGradientBrush> 
            </TextBlock.Background> 
            <ContentPresenter ContentSource="Header" 
                 Margin="0" /> 
        </TextBlock> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" 
           Value="True"> 
          <Setter TargetName="TheHeader" 
            Property="Tag" 
            Value="Red" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+1

Ihr Recht, das ist hacky. Aber wenn Sie es animieren können, indem Sie die Stopps Names zuweisen, warum können Sie das nicht in einer Kontrollvorlage tun? – nlaq