2011-02-02 10 views
35

Diyelim ki, her biri 10 metin bloğuna sahip, alt öğeleri olan iki farklı, ayrı yığın panelim var (SPA ve SPB olarak adlandırıyoruz). SPA'daki tüm textblock'lar tek bir stil kullanmalı ve SPB'deki tüm textblock'lar bir başkasını kullanmalıdır. Bunu başarmanın bir yolu, Kaynaklar'daki iki stili bildirmek ve daha sonra, ilk yığın panelindeki tüm 10 metin bloğuna Style="style1" ekler ve ikinci öğede tüm 10'a Style="style2" ekler. Ancak, yığın kümesine, bir şekilde, yığın kümesinin, metin bloğu olan tüm alt öğelere uygulanmasını söyleyen bir stil eklemek için kolay bir yol olması gerektiği anlaşılıyor. Bunu yapmak için zaten var mı?Yığın panelindeki tüm textblock'lar için stil ayarlama

Bu çözüm için doğal olarak bakmamın nedeni, CSS ile aynı türden bir şeyi HTML'de nasıl yaptığınızdır ve XAML stiliyle benzer bir özellik olacağını umuyorum.

Teşekkürler!

P.S. Silverlight'la çalışıyorum, ama durumumu tahmin ediyorum ve genel olarak XAML/WPF için herhangi bir çözüm (varsa).

+0

"Ben durumumu ve ne olursa olsun çözüm tahmin ediyorum (eğer varsa) Genel olarak XAML/WPF için geçerlidir. " Ve yıllar boyunca bu senin için nasıldı? :) –

cevap

54

Ana konteynerünüzün kaynaklar bölümünde, stilinizi x:Key özniteliğine ve TextBlock hedef türüne getirin. Daha sonra, her bir StackPanel için her kaynak bölümünde, BasedOn özniteliğinin ana stilinizin anahtarına ayarlandığı bir stil koyabilirsiniz (yalnızca anahtarın adı değil, StaticResource bağlamayı kullanmayı unutmayın) ve sonra TargetType="{x:Type TextBlock}" deyin ve bitin etiket. Bu, stili StackPanel'e getirmeli ve tüm TextBlock'larınızı şekillendirmelidir.

<Window ...> 
    <Window.Resources> 
     <Style x:Key="tbstyle" TargetType="{x:Type TextBlock}"> 
      <!-- put setters here --> 
     </Style> 
    </Window.Resources> 
    <StackPanel name="SPA"> 
     <StackPanel.Resources> 
      <Style BasedOn="{StaticResource tbstyle}" TargetType="{x:Type TextBlock}" /> 
     </StackPanel.Resources> 
     <TextBlock ... /> 
     <TextBlock ... /> 
     <TextBlock ... /> 
     <TextBlock ... /> 
     <TextBlock ... /> 
    </Stackpanel> 
    <StackPanel name="SPB"> 
     <StackPanel.Resources> 
      <Style BasedOn="{StaticResource tbstyle}" TargetType="{x:Type TextBlock}" /> 
     </StackPanel.Resources> 
     <TextBlock ... /> 
     <TextBlock ... /> 
     <TextBlock ... /> 
     <TextBlock ... /> 
     <TextBlock ... /> 
    </StackPanel> 
</Window> 
+0

Güzel! Çözümünüzle ilgili hoşuma giden şey, hantal stilleri bireysel kaynak bölümlerinden uzak tutarken, bu tek yığın panelin dışında başka bir yerde kullanılmasına izin veren hedefimi gerçekleştirmesidir. Teşekkürler! – JoeCool

+0

Geçen hafta benzer bir problem üzerinde çalışırken BasedOn'u keşfettim. Stili bir ResourceDictionary içine yerleştirebilir ve onu pencerenizin kaynaklarına eklediğiniz sürece kullanabilirsiniz. –

12
<StackPanel> 
    <StackPanel.Resources> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Margin" 
        Value="5" /> 
     </Style> 
    </StackPanel.Resources> 
    <TextBlock Text="Text" /> 
    <TextBlock Text="Text" /> 
    <TextBlock Text="Text" /> 
    <TextBlock Text="Text" /> 
</StackPanel> 
4

Her yığın panelinin Kaynakları varsayılan metin bloğu stilini geçersiz kılarak gerçekleştirebilirsiniz:

<StackPanel> 
    <StackPanel.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Background" 
        Value="Red"/> 
     </Style> 
    </StackPanel.Resources> 

    <TextBlock .../> 
    <TextBlock .../> 
    <TextBlock .../> 
    <TextBlock .../> 
</StackPanel> 

<StackPanel> 
    <StackPanel.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Background" 
        Value="Green"/> 
     </Style>     
    </StackPanel.Resources> 

    <TextBlock .../> 
    <TextBlock .../> 
    <TextBlock .../> 
    <TextBlock .../> 
</StackPanel> 
İlgili konular