2011-02-02 24 views
6

Özel kontroller oluşturmak için MS'in kontrol şablonlarını temel olarak kullanmaya başladığımdan beri bunu merak ettim. Neden bir Şablonu xaml, WPF?

örneğin Etiket örneği inceleyelim: http://msdn.microsoft.com/en-us/library/ms752327.aspx

neden yeryüzünde böyle tanımlanır:

<Style x:Key="{x:Type Label}" TargetType="Label"> 
    <Setter Property="HorizontalContentAlignment" Value="Left" /> 
    <Setter Property="VerticalContentAlignment" Value="Top" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Label"> 
     <Border> 
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          RecognizesAccessKey="True" /> 
     </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Foreground"> 
       <Setter.Value> 
       <SolidColorBrush Color="{DynamicResource DisabledForegroundColor}" /> 
       </Setter.Value> 
      </Setter> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

ve doğrudan bu gibi değil: Bir olarak adlandırılan sonra

<ControlTemplate x:Key="{x:Type Label}" TargetType="Label"> 
    <Border> 
     <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
         VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
         RecognizesAccessKey="True" /> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="false"> 
     <Setter Property="Foreground"> 
      <Setter.Value> 
      <SolidColorBrush Color="{DynamicResource DisabledForegroundColor}" /> 
      </Setter.Value> 
     </Setter> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

ve Şablon stili ile doğrudan ve değil mi?

Böyle şeyler yapmak için göremediğim gizli bir neden var mı? ya da şeyleri yapmanın sadece bir yolu bu mu?

(Not: hepimiz bu değerleri tutarsanız o bir etiket için varsayılan değerler vardır ve bu temelde yararsız olduğunu biliyorum bu çünkü yatay ve dikey hizalama belirleyiciler olduğunu söyleme)

cevap

8

olmadan Bir Style kullanarak, şablonu belirli bir kontrol türünün tüm örneklerine otomatik olarak atamak mümkün değildir. Denetim şablonu için x:Key="{x:Type Label}" ayarı, numaralı değerini bu şablonu otomatik olarak Etiket etiketinin tüm denetimlerine uygular.

Bir stil Button için TargetType ayarlayarak görsel ağacında bildiriminde altındaki tüm düğmeler için geçerli yapabilir, ancak bir Stil içine sarın yoksa, bir şablonla aynı yapamaz

Bu şablon için Setter var.

Ayrıca x:Key tanımı atlanırsa x:KeyTargetType olarak ayarlanır gibi sizin örnekte sen

<Style TargetType="Label"> 

ile

<Style x:Key="{x:Type Label}" TargetType="Label"> 

alışverişi de unutmayın.

+0

oy, şablonlar ve stiller için de aynı şekilde çalıştı. Bunu sadece kendi gözlerimle görmek için deneyeceğim (bu 2 oyuncunun farklı olduğuna inanamıyorum ...) cevabın ikinci kısmı için, katılmıyorum (konuyla ilgili diğer sorumu gördünüz) . Hala aldığım davranış için geçerli bir açıklama bulamadı, ama x: anahtarını kaldırmak her zaman olduğu gibi çalışmıyor (en azından benim için ...) – David

+1

Bir denetimin stili tanımlanır, görsel ağacı, x ile bir stil tanımı bulana kadar çaprazlayacaktır: Anahtar kendi türüne eşittir ve sonra bu stili kendisine uygulayacaktır. Aynı mantık, Şablonlar (veya bu konuyla ilgili başka bir kaynak) için uygulanmadığı için, gerçekten bu kadar garip değil;) –

+0

Tamam, onu kendi gözlerimle gördüm. Bunu sormadan önce denemeliydi. Hatta bundan daha da kötüsü: Bir ControlTemplate'e bir Stili yayınlamanın imkânsız olduğunu söyleyerek derlendikten sonra bir hata alırsınız. Bu, yazdıklarınızla mantıklı. Bunun Şablonlar ve Stiller için de çalışacağını düşünürdüm ... (neden olmasın?) – David