2009-05-07 11 views
12

मेरे पास एक नियंत्रण है जो आपको (आपने अनुमान लगाया है) नियंत्रण प्राप्त किया है। जब भी FontSize या Style गुण परिवर्तित होते हैं, तो मैं एक अधिसूचना प्राप्त करना चाहता हूं। डब्ल्यूपीएफ में, मैं DependencyProperty.OverrideMetadata() पर कॉल करके ऐसा करूंगा। बेशक, इस तरह की उपयोगी चीजें सिल्वरलाइट में कोई जगह नहीं है। तो, किसी को किस प्रकार की अधिसूचनाएं मिल सकती हैं?सिल्वरलाइट: विरासत में परिवर्तन की अधिसूचना कैसे प्राप्त करें प्रॉपर्टीप्रॉपर्टी

उत्तर

15

मुझे लगता है कि यह एक बेहतर तरीका है। अभी भी पेशेवरों और विपक्ष को देखने की जरूरत है।

/// Listen for change of the dependency property 
    public void RegisterForNotification(string propertyName, FrameworkElement element, PropertyChangedCallback callback) 
    { 

     //Bind to a depedency property 
     Binding b = new Binding(propertyName) { Source = element }; 
     var prop = System.Windows.DependencyProperty.RegisterAttached(
      "ListenAttached"+propertyName, 
      typeof(object), 
      typeof(UserControl), 
      new System.Windows.PropertyMetadata(callback)); 

     element.SetBinding(prop, b); 
    } 

और अब, आप की तरह, एक तत्व की एक संपत्ति का एक परिवर्तन सूचना के लिए रजिस्टर करने RegisterForNotification कॉल कर सकते हैं।

RegisterForNotification("Text", this.txtMain,(d,e)=>MessageBox.Show("Text changed")); 
RegisterForNotification("Value", this.sliderMain, (d, e) => MessageBox.Show("Value changed")); 

सिल्वरलाइट 4.0 बीटा का उपयोग करते हुए एक ही http://amazedsaint.blogspot.com/2009/12/silverlight-listening-to-dependency.html

पर यहाँ मेरी पोस्ट देखें।

+0

मुझे यह पसंद है कि यह बदसूरत बाध्यकारी को लपेटने का एक अच्छा तरीका है, लेकिन यह संपत्ति परिवर्तन अधिसूचनाएं प्राप्त करने का एक बहुत ही भारी तरीका है। – MojoFilter

+1

जब तक हम कोड से पूरी तरह से करने की जरूरत के रूप में, मुझे लगता है जब तक हम सिल्वरलाइट में DependencyPropertyDescriptor एमएस – amazedsaint

+0

से मैं भी इस दृष्टिकोण का उपयोग किया है मिल हम एक और विकल्प नहीं है, दुर्भाग्य से यह स्मृति लीक। मेरे अनुभव में यह आपके द्वारा उपयोग किए जाने वाले तत्व के संदर्भ में एक संदर्भ रखेगा, जो बदले में अन्य वस्तुओं पर निर्भर करेगा।अपराधी कॉलबैक प्रतीत होता है जो आपके आवेदन के जीवन के लिए आपके विचार का संदर्भ बनाए रखेगा। –

-2

यह जो मैं हमेशा का उपयोग है (हालांकि SL पर इसका परीक्षण किया है नहीं, बस WPF पर):

/// <summary> 
    /// This method registers a callback on a dependency object to be called 
    /// when the value of the DP changes. 
    /// </summary> 
    /// <param name="owner">The owning object.</param> 
    /// <param name="property">The DependencyProperty to watch.</param> 
    /// <param name="handler">The action to call out when the DP changes.</param> 
    public static void RegisterDepPropCallback(object owner, DependencyProperty property, EventHandler handler) 
    { 
     // FIXME: We could implement this as an extension, but let's not get 
     // too Ruby-like 
     var dpd = DependencyPropertyDescriptor.FromProperty(property, owner.GetType()); 
     dpd.AddValueChanged(owner, handler); 
    } 
+5

मुझे पूरा यकीन है कि दुर्भाग्यवश, निर्भरताप्रॉपर्टी डिस्कार्टिप्टर सिल्वरलाइट में पौराणिक जानवर हैं। – MojoFilter

+2

DependencyPropertyDescriptor सिल्वरलाइट 2 या द्वारा समर्थित नहीं है 3 – markti

0

आप बाहर से संपत्ति निर्भरता सुन नहीं कर सकते सूचनाएं बदल दिया है।

आप निम्न कोड पंक्ति के साथ निर्भरता संपत्ति मेटाडाटा पहुँच सकते हैं:

PropertyMetadata metaData = Control.ActualHeightProperty.GetMetadata(typeof(Control)); 

हालांकि, केवल सार्वजनिक सदस्य सामने आ रहा है कि "DefaultValue" है।

तरीके WPF में ऐसा करने की एक भीड़ कर रहे हैं। लेकिन वे वर्तमान में Silverlight 2 या 3

0

एकमात्र समाधान मैं देख रहा हूँ LayoutUpdated घटना को सुनने के लिए है द्वारा समर्थित नहीं हैं - हाँ, मैं जानता हूँ कि यह एक बहुत कहा जाता है। ध्यान दें कि कुछ मामलों में इसे फ़ॉन्टसाइज़ या स्टाइल बदल दिया गया है, भले ही इसे नहीं कहा जाएगा।

6

यह एक नहीं बल्कि घृणित हैक है, लेकिन आप एक दो-तरफा बाध्यकारी इस अनुकरण करने के लिए इस्तेमाल कर सकते हैं।

public class FontSizeListener { 
    public double FontSize { 
     get { return fontSize; } 
     set { fontSize = value; OnFontSizeChanged (this, EventArgs.Empty); } 
    } 

    public event EventHandler FontSizeChanged; 

    void OnFontSizeChanged (object sender, EventArgs e) { 
     if (FontSizeChanged != null) FontSizeChanged (sender, e); 
    } 
} 

तो जैसे बाध्यकारी बनाने के लिए::

<Canvas> 
    <Canvas.Resources> 
    <FontSizeListener x:Key="listener" /> 
    </Canvas.Resources> 

    <MyControlSubclass FontSize="{Binding Mode=TwoWay, Source={StaticResource listener}, Path=FontSize}" /> 
</Canvas> 

फिर अपने नियंत्रण उपवर्ग में श्रोता के घटना के लिए ऊपर हुक

अर्थात तरह कुछ है।

+0

जब MyControlSubclass FONTSIZE संपत्ति परिवर्तन, बाध्यकारी स्पष्ट हो जाएगा तो यह यह काम नहीं करता है? नहीं? –

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