2010-03-04 11 views
10

मेरे पास एक नौसिखिया WPF प्रश्न है।क्या डब्ल्यूपीएफ में एक स्थिर संसाधन के लिए एक प्रकार कनवर्टर की आपूर्ति करना संभव है?

मेरे उपयोगकर्ता नियंत्रण की कल्पना इस तरह एक नाम स्थान घोषणा है:

xmlns:system="clr-namespace:System;assembly=mscorlib" 

और मैं इस तरह उपयोगकर्ता नियंत्रण के लिए संसाधन हैं: मेरे उपयोगकर्ता नियंत्रण में कहीं

<UserControl.Resources> 
    <system:Int32 x:Key="Today">32</system:Int32> 
</UserControl.Resources> 

और फिर मैं इस किया है :

<TextBlock Text="{StaticResource Today}"/> 

इससे कोई त्रुटि आएगी क्योंकि Today को पूर्णांक संसाधन के रूप में परिभाषित किया गया है, लेकिन टेक्स्ट प्रॉपर्टी स्ट्रिंग की अपेक्षा कर रही है। यह उदाहरण विकसित है, लेकिन उम्मीद है कि सवाल का वर्णन करता है।

सवाल यह है कि, मेरा संसाधन प्रकार संपत्ति प्रकार से बिल्कुल मेल खाता है, क्या मेरे संसाधनों के लिए कनवर्टर प्रदान करने का कोई तरीका है? बाइंडिंग या एक प्रकार कनवर्टर के लिए IValueConverter की तरह कुछ।

धन्यवाद!

उत्तर

23

यदि आप बाइंडिंग का उपयोग करते हैं तो यह संभव है। यह थोड़ा अजीब लगता है, लेकिन यह वास्तव में काम करेंगे:

<TextBlock Text="{Binding Source={StaticResource Today}}" /> 

यह इसलिए क्योंकि बाध्यकारी इंजन में निर्मित बुनियादी प्रकार के लिए जैसे रूपांतरण किया है। इसके अलावा, बाध्यकारी का उपयोग करके, यदि एक अंतर्निर्मित कनवर्टर मौजूद नहीं है, तो आप अपना स्वयं का निर्दिष्ट कर सकते हैं।

+1

बिल्कुल सही, जानकारी के लिए धन्यवाद! – Notre

+0

क्या होगा यदि आप एक StatisResource से रंग घटकों को प्राप्त करना चाहते हैं जो एक रंग है? (उदाहरण के लिए, StaticResource रंग की अस्पष्टता को बदलने के लिए।) निम्न कार्य करना प्रतीत नहीं होता है: <रंग ए = "# 99" आर = "{बाइंडिंग स्रोत = {स्टेटिक रिसोर्स फोनएक्वेंट कोलर}, पथ = आर}" जी = "{बाइंडिंग स्रोत = {स्टेटिक रिसोर्स फोनएक्सेन्टकॉलर}, पथ = जी}" बी = "{बाइंडिंग स्रोत = {स्टेटिक रिसोर्स फोनएक्सेन्ट कॉलर}, पथ = बी}" /> –

+1

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

4

एबे का उत्तर ज्यादातर स्थितियों में काम करना चाहिए। एक और विकल्प StaticResourceExtension वर्ग का विस्तार करना होगा:

public class MyStaticResourceExtension : StaticResourceExtension 
{ 
    public IValueConverter Converter { get; set; } 
    public object ConverterParameter { get; set; } 

    public MyStaticResourceExtension() 
    { 
    } 

    public MyStaticResourceExtension(object resourceKey) 
     : base(resourceKey) 
    { 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     object value = base.ProvideValue(serviceProvider); 
     if (Converter != null) 
     { 
      Type targetType = typeof(object); 
      IProvideValueTarget target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; 
      if (target != null) 
      { 
       DependencyProperty dp = target.TargetProperty as DependencyProperty; 
       if (dp != null) 
       { 
        targetType = dp.PropertyType; 
       } 
       else 
       { 
        PropertyInfo pi = target.TargetProperty as PropertyInfo; 
        if (pi != null) 
        { 
         targetType = pi.PropertyType; 
        } 
       } 
      } 
      value = Converter.Convert(value, targetType, ConverterParameter, CultureInfo.CurrentCulture); 
     } 
     return value; 
    } 
} 
+0

ओह! यह भी दिलचस्प है। धन्यवाद थॉमस! – Notre

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