2009-10-09 12 views
7

Yani, tasarladığımız yeni düğme görünümü için en temel şeyleri tanımlayan ana bir ControlTemplate'im var. Ama bu buton için 3 tane başka kontrol şablonu yapmak istiyorum, böylece farklı renkler ayarlayabiliriz; ancak ana ControlTemplate'i kopyalayıp oradaki rengi kopyalamak istemiyorum, bunun yerine bundan “miras almak istiyorum” (Style'deki BasedOn özelliği gibi) ve miras alınan ControlTemplate'deki rengi değiştirmek istiyorum.Bir ControlTemplate'i WPF'de bir Stili genişletmekle aynı şekilde genişletmek mümkün mü?

Bu mümkün mü?

Teşekkürler!

cevap

6

Çözüm bulundu. ControlTemplates'i genişletmezsiniz, bunun yerine istediğiniz tüm temel davranışları tanımlarsınız ve sonra bir stilin veya kontrolün kendisini değiştirmesine izin vermiş olursunuz. Örneğin aşağıdaki örneği ele alalım. ControlTemplate OpacityMask ve benim dikdörtgen için yuvarlak köşeler, Stiller (a TemplateBinding yardımıyla) her düğme için arka plan rengini ayarlar belirler ve benim çözüm var:

<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

Evet, bunu yapmanın en iyi yolu budur. Gevşek olarak, ControlTemplate orada ne olduğunu tanımlamalı, Stil aslında neye benzediğini tanımlamak için ControlTemplate üzerindeki özellikleri değiştirir. –

+0

Denetim şablonunuzda denetiminizin bulunmadığı özellikler varsa, bu çalışmaz. –

0

Alternatif Tanımlayabileceğiniz bir " DynamicResource "Kontrol Şablonunuzdaki herhangi bir bağımlılık özelliğine referans verin ve mevcut kaynakların varlığı göz önünde bulundurulduğunda değeri çözmesini sağlayın. Örneğin, Background = "{DynamicResource SomeBrushColorVariable}" öğesini ayarlayabilirsiniz. Sonra SomeBrushColorVariable, App.xaml dosyanızda birleştirilen veya bazı kullanıcı tercihleri ​​ekran ayarı veya renk şeması verilen kullanıcı tarafından ayarlanmış olan farklı Kaynak Kaynaklarını değiştirebilir.

İlgili konular