2010-07-11 16 views
8

Özel bir stili olan normal StackPanel ile aynı olan bir özel stil paneli (StyledStackPanel) oluşturmaya çalışıyorum. Örneğin - tarzı yazılı tarafından, bir alt çizgi eklemek için basitçe ise: Yazdığım sanki ben aynı görünümü almak istiyorumWPF StackPanel şablonunu değiştirme

<StyledStackPanel> 
    <!--User content goes here--> 
</StyledStackPanel> 

:

<StackPanel> 
    <!--User content goes here--> 
</StackPanel> 
<Border Height="1" BorderBrush="Blue"/> 

StackPanel bir Control olsaydı, Bu kontrolün DataTemplate yerini alabilirdim. Ancak, FrameworkElement'u miras alan Panel'u miras alır.
StackPanel'un şablonunu değiştirmenin bir yolu var mı?

cevap

6

Orada bir panel için bir ControlTemplate ayarlamak için hiçbir yolu yoktur, ancak birkaç seçeneğiniz vardır:

  1. özel bir Oluştur/StackPanel'i çocuk olarak kullanan kullanıcı denetimi.

  2. StackPanel dan

    devral ve ayrıca çizim panelin çocukların yanında biraz boşluk eklemek için MeasureOverride ve ArrangeOverride geçersiz gerekebilir (özel stil çizmek OnRender geçersiz kılar.

  3. devral doğrudan Panel ve geçersiz kılma işleminden OnRender, MeasureCore ve ArrangeCore - eğer paneli kullanmanız gerekiyorsa ve StackPanel düzeni algoritmasının basit olmasından bu yana belki de StackPanel'in tüm seçeneklerine ihtiyacınız yok.

  4. Dekoratör (çiziminizi kodda yaparsınız) veya ContentControl (ControlTemplate'i kullanmak isterseniz) ve wa Eğer kullandığınız zaman onunla paneli rp:

     <l:PanelStyle> 
         <StackPanel> .. <StackPanel> 
        </l:PanelStyle> 
    
  5. ItemsControl için stil yaz (bir dikey StackPanel var varsayılan), ItemsControl ayarlayabileceğiniz bir ControlTemplate vardır ve temelde bir panel sarar.

StackPanel'in özelliklerine erişmeniz gerekirse veya seçenek yoksa 5 seçeneği ile devam ediyorum.

+0

6 yıl sonra ... üzgünüm. Seçenek 4'ün kısa bir demosuna atmak mümkün mü? – matrixugly

1

Alt öğelerini StackPanel iç kısmına ekleyen normal bir özel denetim yapmalısınız. Örneğin

:

[ContentProperty("Children")] 
public class StyledStackPanel : UserControl { 
    public UIElementCollection Children { get { return stackPanel.Children; } } 
} 

(Test edilmemiş)

+3

Burada sorun, istenen tüm StackPanel özelliklerinin yeniden çalıştırılması gerektiğidir. Daha basit bir çözüm var mı? StackPanel'den türetilmeli ve daha sonra bir adorner ile eklenebilir tasarımlar yapılmasına yardımcı olur mu? – HCL