2010-01-05 15 views
9

Böyle Button için kendi ControlTemplate yarattık: düğme aslında çift Marjı sahiptirWPF: Neden ControlTemplate'de {TemplateBinding Margin} kullanmamalıyım - Marj sadece elemanın kapsayıcıları içindir?

<Button 
    Style="{StaticResource LightButtonStyle}" 
    Margin="20" 
    > 
    Hello world! 
</Button> 

:

<Style x:Key="LightButtonStyle" TargetType="{x:Type ButtonBase}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ButtonBase}"> 
       <Border 
        x:Name="WrappingBorder" 
        Margin="{TemplateBinding Margin}" 
        ... 
        > 
        <ContentPresenter 
         Content="{TemplateBinding Content}" 
         ... 
         > 
        </ContentPresenter> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Şimdi, ben gibi, benim düğmeye marjı ayarladığınızda fark etmiş 40. Kontrolün aslında Margin'i asla kullanmaması gerektiğini ve Margin mallarının düzenleme aşamasında sadece butonun ataları tarafından okunabileceğini varsaydım. Daha sonra WPF varsayılan stillerine baktım ve bunların hiçbirinin Marjı kullanmadığını öğrendim.

Bu doğru sonuç (Marj'ın konteynırlar tarafından sadece doğru şekilde düzenlenmiş olması kontrol altında mı)? Başka bir deyişle, {TemplateBinding Margin} 'i her zaman kullandığımda, çift kenar boşlukları alır mıyım? Ve benim kontrolümün kullanmaması gereken benzer özelliklerin bir listesi var mı (sadece "çevreleyen dünya" için olduğu gibi)?

Bunu açıklayan MSDN sayfasına yönlendirir misiniz? Teşekkür ederim!

DÜZENLEME:

ben http://msdn.microsoft.com/en-us/library/ms745058.aspx ve http://msdn.microsoft.com/en-us/library/ms751709.aspx cevapları bulmak gerekir sanırım, ama ben onlar hep olduğunu, asla Marjı özelliğini kullanır kontrol olduğunu açıkça belirtildiği sanmıyorum bunu eValues ​​ve düzenini etkileyecek için kullanır atası veya wpf sistemi ...

cevap

5

Eğer şablonu içinde Margin bağlı olduğunu göreceksiniz çerçeve sağlanan varsayılan şablonları bakarsak Vardığınız sonuç, haklıKontrolün Padding özelliği.

+0

Teşekkürler, ben bu ... Eğer layouting de Teminatın (ve belki diğer düzen özgü özellikler) rolünü açıklıyor bazı msdn sayfası veya blogpost biliyor mu fark? Onu google denedim, ama gerçek bir cevap vermedi. –

+1

Eminim google size yardımcı olabilir, ama bir şey söyleyeyim (ya da yazmak). Marj, kapsayıcı tarafından düzen sürecinin düzenleme geçişinde kullanılır, kap, alt öğeyi yatay ve dikey hizalamalardan ve kenar boşluğundan türetilen bir konuma yerleştirir. –

+0

Teşekkür ederim, bu tam olarak istediğim şeydi - Margin hariç, şablonun içinde asla HorizontalAlignment ve VerticalAlignment kullanmamalıyım. –

5

Marj, düzen sistemi tarafından otomatik olarak uygulanır, bunun yerine bir Padding'i kullanmanız gerekir.

<Border x:Name="WrappingBorder" Margin="{TemplateBinding Padding}" ... /> 
+0

Aviad önce cevap verdi (ve marj daha sonraki bir yorumda uygulandığında fazı ima etti), bu yüzden cevabını kabul ettim - ama çok teşekkür ederim! –

İlgili konular