2011-02-02 13 views
5

क्या स्टाइल के माध्यम से संलग्न संपत्ति सेट करने का कोई तरीका है?डब्ल्यूपीएफ: क्या मैं एक शैली के माध्यम से संलग्न संपत्ति को परिभाषित/सेट कर सकता हूं?

मेरे पास उदा। एक बटन जो इंटरेक्शन सामान पर (System.Windows.Interactivity से)

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

अब मैं एक शैली है, जिसमें कि Interaction.Triggers संपत्ति सेट किया गया है, जिससे कि संपत्ति निर्दिष्ट करने के लिए होने से अतिरिक्तताओं की जगह चाहते हैं सेट कर दिया जाता प्रत्येक बटन उदाहरण पर। क्या यह डब्ल्यूपीएफ में संभव है?

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

किसी तरह मैं नहीं कर सकते कि कैसे देखते हैं, लेकिन मैं वेब में अन्य उदाहरण हैं, जहां संलग्न गुण एक शैली के भीतर से सुलभ होने लगते देखा है ...

अद्यतन

तो मूल रूप से यह इंटरैक्शन के साथ एक मुद्दा है। ट्रिगर्स को कुछ "सेट" करने का कोई तरीका नहीं है। मुझे इंटरैक्शन परिभाषाओं के एक सेट का पुन: उपयोग कैसे करना चाहिए?

+0

संभव डुप्लिकेट: http://stackoverflow.com/questions/4067876/set-hidden-attachedproperty-through-style – flq

उत्तर

8

यह केवल पढ़ने योग्य संग्रह गुणों (इनपुट बाइंडिंग संग्रह के साथ एक ही चीज़) के साथ एक ज्ञात मुद्दा है। इस समस्या को हल करने के लिए मैं एक संलग्न संपत्ति बना लिया है:

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()); 
     } 
    } 
} 

यह गुण, कस्टम 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

ऐसा लगता है, लेकिन मैं ट्रिगर में डेटाकॉन्टेक्स्ट का उपयोग करने के लिए उलझन में हूं। मुझे काम करने के लिए सापेक्ष स्रोत पूर्वजों टाइप आदि नहीं मिल रहा है ... – flq

+0

आपको समझने की जरूरत है कि रिश्तेदार स्रोत कैसे काम करता है। यह उन तत्वों पर काम करता है जो दृश्य पेड़ में हैं। मैं इस मामले में ट्रिगर्स दृश्य पेड़ में नहीं हैं - ट्रिगर संग्रह दृश्य वृक्ष में एक तत्व की एक संपत्ति है। इस मामले में डेटा संदर्भ विरासत कैसे काम करता है यह है कि ट्रिगर्स फ्रीजबल का उत्तराधिकारी है। आप यहां इसके बारे में पढ़ सकते हैं: http://drwpf.com/blog/category/freezables/ –

संबंधित मुद्दे

 संबंधित मुद्दे