2009-10-09 13 views
7

Die Sache ist, dass ich eine Haupt-ControlTemplate habe, die das grundlegendste Zeug für den neuen Button-Look definiert, den wir entwickeln. Aber ich möchte 3 andere Kontrollschablonen für diesen Knopf machen, damit wir verschiedene Farben in diesen einstellen können; aber ich möchte nicht kopieren Sie die Haupt-ControlTemplate und ändern Sie die Farbe dort, stattdessen möchte ich davon "erben" (wie mit der BasedOn-Eigenschaft in Style) und ändern Sie die Farbe in der geerbten ControlTemplate.Ist es möglich, ein ControlTemplate genauso zu erweitern, wie Sie einen Style in WPF erweitern?

Ist das möglich?

Danke!

Antwort

6

Die Lösung gefunden. Sie erweitern ControlTemplates nicht, stattdessen definieren Sie das gewünschte grundlegende Verhalten und lassen entweder einen Stil oder das Steuerelement selbst modifizieren. Nehmen Sie das Beispiel unten zum Beispiel. Die Control setzt die OpacityMask und die runden Ecken für mein Rechteck, die Styles für jede Taste, um die Farbe des Hintergrunds setzen (mit Hilfe eines Template), und es ist meine Lösung:

<Window.Resources> 
     <ControlTemplate x:Key="BaseMainButtonTemplate" TargetType="{x:Type Button}"> 
      <Grid TextBlock.Foreground="White" TextBlock.FontFamily="Calibri"> 
       <Rectangle Stroke="#FFE8E6E6" x:Name="rectangle" RadiusX="14.5" RadiusY="14.5" Fill="{TemplateBinding Property=Background}"> <!-- This TemplateBinding takes the color set by the style and applies it to the rectangle. Doing it this way, allows the style to modify the background color --> 
        <Rectangle.OpacityMask> 
         <LinearGradientBrush EndPoint="0,1" SpreadMethod="Reflect"> 
          <GradientStop Offset="0" Color="Transparent"></GradientStop> 
          <GradientStop Offset="1" Color="Gray"></GradientStop> 
         </LinearGradientBrush> 
        </Rectangle.OpacityMask> 
       </Rectangle> 
       <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/> 
      </Grid> 
      <ControlTemplate.Triggers> 
       <!-- OpacityMask when it's Focused, Defaulted and Mouse is over --> 
       <Trigger Property="IsFocused" Value="True"/> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="OpacityMask" TargetName="rectangle"> 
         <Setter.Value> 
          <LinearGradientBrush EndPoint="0,1" SpreadMethod="Repeat"> 
           <GradientStop Offset="1" Color="Transparent"></GradientStop> 
           <GradientStop Offset="0" Color="Gray"></GradientStop> 
          </LinearGradientBrush> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
       <!-- OpacityMask when it's pressed --> 
       <Trigger Property="IsPressed" Value="True"> 
        <Setter Property="Stroke" TargetName="rectangle"> 
         <Setter.Value> 
          <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
           <GradientStop Color="#FF223472" Offset="0"/> 
           <GradientStop Color="#FFF2F0F0" Offset="0.911"/> 
          </LinearGradientBrush> 
         </Setter.Value> 
        </Setter> 
        <Setter Property="StrokeThickness" TargetName="rectangle" Value="3"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
     <Style x:Key="BlueButtonStyle" TargetType="{x:Type Button}"> 
      <Setter Property="Background" Value="Blue" /> 
      <Setter Property="Template" Value="{StaticResource BaseMainButtonTemplate}"> 
      </Setter> 
     </Style> 
     <Style x:Key="RedButtonStyle" TargetType="{x:Type Button}"> 
      <Setter Property="Background" Value="Red" /> 
      <Setter Property="Template" Value="{StaticResource BaseMainButtonTemplate}"> 
      </Setter> 
     </Style> 
     <Style x:Key="GreenButtonStyle" TargetType="{x:Type Button}"> 
      <Setter Property="Background" Value="Green" /> 
      <Setter Property="Template" Value="{StaticResource BaseMainButtonTemplate}"> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <StackPanel> 
      <Button Style="{StaticResource BlueButtonStyle}" Height="30" Content="Test"> 
      </Button> 
      <Button Style="{StaticResource RedButtonStyle}" Height="30" Content="Test"> 
      </Button> 
      <Button Style="{StaticResource GreenButtonStyle}" Height="30" Content="Test"> 
      </Button> 
     </StackPanel> 
    </Grid> 
+0

Ja, das ist der beste Weg, es zu tun. In der Regel sollte die ControlTemplate definieren, was da ist, der Style ändert Eigenschaften auf der ControlTemplate, um zu definieren, wie er tatsächlich aussieht. –

+0

Wenn in Ihrer Steuerelementvorlage Attribute vorhanden sind, die Ihr Steuerelement nicht enthält, funktioniert dies nicht. –

0

Alternativ können Sie definieren ein " DynamicResource "verweist auf eine Abhängigkeitseigenschaft in Ihrer Steuerelementvorlage und lässt den Wert des vorhandenen Werts auflösen, da verfügbare Ressourcen vorhanden sind. Zum Beispiel können Sie Hintergrund = "{DynamicResource SomeBrushColorVariable}" Dann SomeBrushColorVariable kann bestimmte ResourceDictionaries ändern, die in Ihre App.xaml-Datei zusammengeführt werden oder sogar vom Benutzer mit einigen Benutzereinstellungen Einstellung oder Farbschema festgelegt.

Verwandte Themen