2009-03-29 15 views
9

<Window.Resources> ben şu tarz tanımlamış:XAML'de denetimleri seçici olarak etkileyen bir stil ayarlamak mümkün mü?

<Style x:Key="textBlockStyle" TargetType="TextBlock"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 

Ben dört TextBlocks olan bazı ızgara tanımlamış:

<WrapPanel> 
     <TextBlock Style="{StaticResource textBlockStyle}">Server</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">IP</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">Port</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">Status</TextBlock> 
    </WrapPanel> 

Sorun: Ben textBlockStyle dört kez başvuru gerekir.

Soru: Bu stili, WrapPanel ya da başka bir yerde stili referansa tekrar etmeden ayarlamak mümkün mü?

Belki bir şey gibi:

<WrapPanel Style="{StaticResource textBlockStyle}"> 
     <TextBlock>Server</TextBlock> 
     <TextBlock>IP</TextBlock> 
     <TextBlock>Port</TextBlock> 
     <TextBlock>Status</TextBlock> 
    </WrapPanel> 

Ben global bir çözüm ararken değilim! Bu x:Key="textBlockStyle" özelliğini silebilirdim, ancak bu, Pencerede tümTextBlocks'u etkiler. Daha seçici bir mekanizmaya ihtiyacım var, ama bu çirkin kod çoğaltması olmadan.

cevap

17

Ölçeklerinin ne kadar iyi olduklarına göre burada sunulan birkaç seçeneğiniz vardır.

Seçenek 1:

<WrapPanel> 
    <WrapPanel.Resources> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Margin" Value="5,0,5,0"/> 
     </Style> 
    </WrapPanel.Resources> 

    <!-- TextBlocks here --> 
</WrapPanel> 

Uyarı: yalnızca o WrapPanel içindeki denetimleri etkiler, böylece WrapPanel düzeyinde kaynak sopa

daha düşük bir seviyede anahtarsız Stil tanımlayın anahtar eksikliği. Bu Style, WrapPanel içinde TextBlock s için geçerli olacaktır.

2. Seçenek: Bir anahtarla daha yüksek bir düzeyde Style, daha sonra olmadan daha düşük bir seviyede başka Style tanımlayabilirsiniz tanımlarsanız daha düşük bir seviyede

de olmadan tekrar bir anahtarla Stil tanımlayın ve daha yüksek düzeyde tek Style bir anahtar ve taban:

<Window> 
    <Window.Resources> 
     <Style TargetType="TextBlock" x:Key="textBlockStyle"> 
      <Setter Property="Margin" Value="5,0,5,0"/> 
     </Style> 
    </Window.Resources> 

    <WrapPanel> 
     <WrapPanel.Resources> 
      <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle"/> 
     </WrapPanel.Resources> 

     <!-- TextBlocks here --> 
    </WrapPanel> 
</Window> 

Bu Style sonuçlanır otomatik ancak bunun dışına, WrapPanelTextBlock s uygulanan. Ayrıca, Style'un ayrıntılarını çoğaltmazsınız - bunlar daha yüksek bir seviyede depolanır.

Seçenek 3:

<!-- TextBlockStyles.xaml --> 
<ResourceDictionary> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 
</ResourceDictionary> 

<!-- Window.xaml --> 
<Window> 
    <WrapPanel> 
     <WrapPanel.Resources> 
      <ResourceDictionary> 
       <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary Source="TextBlockStyles.xaml"/> 
       </ResourceDictionary.MergedDictionaries> 
      </ResourceDictionary> 
     </WrapPanel.Resources> 
    </WrapPanel> 
</Window> 

<!-- Alternative Window.xaml if you have only one RD to merge in --> 
<Window> 
    <WrapPanel> 
     <WrapPanel.Resources> 
      <ResourceDictionary Source="TextBlockStyles.xaml"/> 
     </WrapPanel.Resources> 
    </WrapPanel> 
</Window> 
: Yeri seçici bir ResourceDictionary Stiller ve ayrı bir ResourceDictionary içinde Style s yerleştirin ve seçici bir denetimin Resources koleksiyona o sözlüğü birleştirebilirsiniz,

Son olarak birleştirme

Artık istediğiniz gibi ayrı sözlüklerde tanımlanmış çok sayıda stil kümesine sahip olabilirsiniz ve sonra bunları öğe ağacınıza seçerek uygulayabilirsiniz.

+0

Genellikle önceden tanımlanmış bir stil varsa ve başka bir yerde kullanırsam 2. seçeneği tercih ederim. Harika cevap Kent. –

2

yup, bunu yapabilirsiniz. Neredeyse doğru fikre sahipsiniz. x ihtiyacım yok: {türü x} sözdizimi: tuşu, bu wrappanel tüm TextBlocks için stil ayarlayacaktır Eğer kullanarak

<WrapPanel> 
< WrapPanel. Resources > 
<Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 
</WrapPanel.Resources/> 
     <TextBlock Server</TextBlock> 
     <TextBlock >IP</TextBlock> 
     <TextBlock >Port</TextBlock> 
     <TextBlock >Status</TextBlock> 
    </WrapPanel> 

.... böyle böyle yapar. Farklı stilleri isterseniz, x: tuşunu ve açıklığını hala stil bloğu üzerinde ayarlayabilirsiniz.

İlgili konular