2013-04-04 23 views
6

Veri bağlama özelliği haricinde aynıdır benim WPF XAML çeşitli Stil elemanları, örneğin var:birleştirmek ortak WPF Styles

<TextBlock Style="{StaticResource HasAlphaStyle}" .../> 
: tarzı gibi bir kontrole uygulanır

<Style x:Key="HasAlphaStyle" TargetType="TextBlock"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=HasAlpha, UpdateSourceTrigger=PropertyChanged}" Value="True"> 
      <Setter Property="Background" Value="Red"/> 
      <Setter Property="Foreground" Value="White"/> 
      <Setter Property="FontWeight" Value="Bold"/>     
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=HasAlpha, UpdateSourceTrigger=PropertyChanged}" Value="False"> 
      <Setter Property="Background" Value="LightGreen"/> 
      <Setter Property="Foreground" Value="Black"/> 
      <Setter Property="FontWeight" Value="Normal"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<Style x:Key="HasBetaStyle" TargetType="TextBlock"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=HasBeta, UpdateSourceTrigger=PropertyChanged}" Value="True"> 
      <Setter Property="Background" Value="Red"/> 
      <Setter Property="Foreground" Value="White"/> 
      <Setter Property="FontWeight" Value="Bold"/>     
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=HasBeta, UpdateSourceTrigger=PropertyChanged}" Value="False"> 
      <Setter Property="Background" Value="LightGreen"/> 
      <Setter Property="Foreground" Value="Black"/> 
      <Setter Property="FontWeight" Value="Normal"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

HasAlphaStyle ve HasBetaStyle'mı sağlamlaştırmak için özellik kümelerinin çoğaltılmasına gerek kalmaması için bir yol var mı? İkisi arasındaki tek fark, mülkün Bağlanma Yolu.

+1

İlginç bir soru olarak TextBlocks yazabilirsiniz

public static class TextBlockBehavior { public static readonly DependencyProperty HasValueProperty = DependencyProperty.RegisterAttached("HasValue", typeof(bool), typeof(TextBlockBehavior), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.None)); public static void SetHasValue(DependencyObject depObject, bool value) { depObject.SetValue(HasValueProperty, value); } public static bool GetHasValue(DependencyObject depObject) { return (bool)depObject.GetValue(HasValueProperty); } } 

ve Mülkiyet

Ekli

olduğu Konsolidasyonun amacı, sadece setçiler için bir değerler kümesini koruyabilmeniz için mi? Bunu sadece TextBlocks'a veya herhangi bir FrameworkElement'e uygulayabilmek mi istiyorsunuz? – Dutts

+0

1. Evet; 2. Herhangi bir FrameworkElement –

cevap

3

Eklenen bir özellik oluşturur ve veri tetikleyicileri yerine tetikleyicileri kullanırım. aşağıda Örnek kod: sonra kombine stil

<Style x:Key="HasValueStyle" TargetType="TextBlock"> 
    <Style.Triggers> 
     <Trigger Property="behaviors:TextBlockBehavior.HasValue" Value="True"> 
      <Setter Property="Background" Value="Red"/> 
      <Setter Property="Foreground" Value="White"/> 
      <Setter Property="FontWeight" Value="Bold"/>     
     </Trigger> 
     <Trigger Property="behaviors:TextBlockBehavior.HasValue" Value="False"> 
      <Setter Property="Background" Value="LightGreen"/> 
      <Setter Property="Foreground" Value="Black"/> 
      <Setter Property="FontWeight" Value="Normal"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

olacak ve siz

<TextBlock Style="{StaticResource HasValueStyle}" 
      behaviors:TextBlockBehavior.HasValue="{Binding Path=HasAlpha, UpdateSourceTrigger=PropertyChanged}"   .../> 

<TextBlock Style="{StaticResource HasValueStyle}" 
      behaviors:TextBlockBehavior.HasValue="{Binding Path=HasBeta, UpdateSourceTrigger=PropertyChanged}"   .../> 
+0

için tekrar tekrar kullanılabilen set ediciler seti 'davranışlar:' nedir? Bu bir isim mi? TextBlockBehavior hangi ad alanında? –

+0

@Stealth Rabbi - Evet bu bir ad alanı, lütfen bu aritcle bakın [Nasıl Yapılır: XAML içine bir Ad Alanı İçeri Aktar] (http://msdn.microsoft.com/en-gb/library/bb514546 (v = vs.90)) .aspx) XAML – sthotakura

+0

'daki clr ad alanlarını içe aktarma hakkında, TextBlockBehavior öğesinin bir şey miras alması gerekiyor mu? –