2011-02-02 16 views
5

スタイルを介して添付プロパティを設定する方法はありますか?WPF:スタイルを使用して添付プロパティを定義/設定できますか?

インタラクションのものが

<Button> 
    <i:Interaction.Triggers> 
    ... 
    </i:Interaction.Triggers> 
</Button> 

(System.Windows.Interactivityから)設定されている今、私は、それによってそのプロパティを指定することによって冗長性を置き換える、Interaction.Triggersプロパティが設定されていることをしたスタイルをしたいと思いますどのボタンすべてのButtonインスタンスでこれはWPFでも可能ですか?どういうわけか

<Style Target={x:Type Button}> 
    <!-- ??? --> 
    <Setter PropertyName="i.Interaction.Triggers"> 
    ... 

私はどのように見カントが、私は添付プロパティのスタイルの中からアクセスできるように見えるウェブにおける他の例を見てきました...

更新

ので、基本的に、これはむしろInteraction.Triggersの問題で、何かを「設定」する方法がないということです。インタラクション定義のセットをどのように再利用する必要がありますか?

+0

可能重複:私は肝炎ます非常に有望に見えるhttp://stackoverflow.com/questions/4067876/set-hidden-attachedproperty-through-style – flq

答えて

8

これは、読み取り専用のコレクションプロパティ(InputBindingsコレクションと同じこと)に関する既知の問題です。この問題を解決するために、私は、添付プロパティを作成しました:

public static StyleTriggerCollection GetTriggers(DependencyObject obj) { 
    return (StyleTriggerCollection)obj.GetValue(TriggersProperty); 
} 

public static void SetTriggers(DependencyObject obj, StyleTriggerCollection value) { 
    obj.SetValue(TriggersProperty, value); 
} 

public static readonly DependencyProperty TriggersProperty = 
    DependencyProperty.RegisterAttached("Triggers", typeof(StyleTriggerCollection), typeof(ControlExtensions), new UIPropertyMetadata(null, OnTriggersChanged)); 

static void OnTriggersChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
    var triggers = (StyleTriggerCollection) e.NewValue; 

    if (triggers != null) { 
     var existingTriggers = Interaction.GetTriggers(d); 

     foreach (var trigger in triggers) { 
      existingTriggers.Add((TriggerBase)trigger.Clone()); 
     } 
    } 
} 

標準トリガーコレクションがないpublicコンストラクタがあるため、このプロパティは、カスタムStyleTriggerCollectionを使用しています。あなたのようにそれを使用することができますスタイルセッターで

public class StyleTriggerCollection : Collection<TriggerBase> 
{ 
} 

をこの:

<Setter Property="my:ControlExtensions.Triggers"> 
    <Setter.Value> 
     <my:StyleTriggerCollection> 
      <!-- Put your triggers here --> 
     </my:StyleTriggerCollection> 
    </Setter.Value> 
</Setter> 
+0

、私はコードに戻ってすぐに見える! – flq

+1

これはうまくいくようですが、トリガーでDataContextを使用するのは混乱しています。 RelativeSource AncestorTypeなどが動作するように見えない... – flq

+0

相対的なソースの仕組みを理解する必要があります。これは、ビジュアルツリーにある要素に作用します。この場合、トリガーはビジュアルツリーにはなく、トリガーコレクションはビジュアルツリー内の要素のプロパティに過ぎません。この場合、データコンテキストの継承が機能するのは、トリガがFreezableを継承するからです。あなたはそれについてここで読むことができます:http://drwpf.com/blog/category/freezables/ –

関連する問題