2009-11-02 11 views
10

एक WPF आवेदन में जब घोषित कन्वर्टर्स, क्या मुझे:क्या मुझे App.xaml में कनवर्टर्स घोषित करना चाहिए या प्रति-फ़ाइल संसाधन के रूप में घोषित करना चाहिए?

  1. App.xaml (यानी <Application.Resources/> में) में घोषित सभी मेरी कन्वर्टर्स तो यह पूरा आवेदन
  2. घोषित लिए कन्वर्टर्स केवल जरूरत के लिए उपलब्ध है प्रत्येक Page/Window/ResourceDictionary/UserControl आदि उनके Resources खंड में
  3. कुछ और पूरी तरह से

पठनीयता के संबंध में, विधि 1 मेरे लिए सबसे अच्छा लगता है, लेकिन मेरा प्रश्न प्रदर्शन के बारे में है। प्रदर्शन, स्मृति इत्यादि के मामले में सबसे अधिक संसाधन कौन सा तरीका कुशल है?

उत्तर

37

ठीक है, मैं उन्हें बिल्कुल xaml में घोषित नहीं करता हूं। इसके बजाय, मैं अतिरिक्त रूप से MarkupExtension से मेरा कनवर्टर प्राप्त करता हूं। इस तरह:

public class MyValueConverter : MarkupExtension, IValueConverter 
{ 
    private static MyValueConverter _converter = null; 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (_converter == null) _converter = new MyValueConverter();  
     return _converter; 
    } 

    public object Convert 
    (object value, Type targetType, object parameter, CultureInfo culture) { } 
    public object ConvertBack 
    (object value, Type targetType, object parameter, CultureInfo culture) { } 
} 

यह इस तरह है, मुझे मेरे कनवर्टर कहीं भी उपयोग करने के लिए अनुमति देता है:

Source="{Binding myValue, Converter={converters:MyValueConverter}}" 

जहां कन्वर्टर्स नाम स्थान है, जिसमें मैं अपने कनवर्टर घोषित कर दिया है।

इस चाल को पुराने स्टैक ओवरफ्लो थ्रेड से ही सीख लिया गया।

+2

मैंने अभी कुछ सीखा है, यकीन है कि उपयोगी होगा! – Shimmy

+2

और हां, प्रदर्शन के संदर्भ में यह बेहतर है क्योंकि कनवर्टर का उपयोग होने पर हर बार एक नई वस्तु को तुरंत चालू नहीं किया जाता है। यह मार्कअप एक्सटेंशन में पहली कॉल की वापसी से पहले केवल एक उदाहरण बनाता है और हर बार एक ही उदाहरण देता है। – Yogesh

+0

धन्यवाद! यह जीवन को आसान बनाता है। – si618

0

यदि आपको केवल एक विंडो के लिए कनवर्टर की आवश्यकता है, तो मैं इसे एक खिड़की के लिए रखूंगा (या यहां तक ​​कि कंटेनर नियंत्रण के लिए भी जो उस नियंत्रण का उपयोग करता है)।

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

यदि एक ही कनवर्टर का उपयोग एक से अधिक पृष्ठों द्वारा किया जा रहा है, तो मैं अभी भी प्रत्येक पृष्ठ संसाधन के तहत रखूंगा। वास्तव में, यह एक्सएएमएल में केवल एक अतिरिक्त लाइन है।

वैसे भी, यह मेरी राय है, आज के रूप में। मैं एक और पोस्ट की उम्मीद कर रहा हूं जो वास्तव में विपरीत है। :-)

+0

ऐसी कोई किस्मत नहीं। मेरा जवाब आधा विपरीत था, आधा वही :- पी – devuxer

2

मेरे पास एक संसाधन डिक्शनरी है जो कई सामान्य रूप से आवश्यक कन्वर्टर्स की घोषणा करता है, जैसे कि बूल-टू-विज़िबिलिटी कनवर्टर। मैं इस शब्दकोश को सीधे App.xaml में संदर्भित करता हूं।

मैं अन्य कनवर्टर्स घोषित करता हूं जो पृष्ठ/विंडो-स्तर पर किसी दिए गए परिस्थिति के लिए अधिक विशिष्ट हैं (या किसी पृष्ठ/विंडो द्वारा संदर्भित संसाधन डॉक्स में)।

मैं निश्चित रूप से प्रदर्शन प्रश्न का उत्तर नहीं दे सकता, लेकिन अगर मैं लोड समय या मेमोरी उपयोग में व्यावहारिक अंतर करता हूं तो मुझे आश्चर्य होगा। एक कनवर्टर घोषित करना मूल रूप से एक ऑब्जेक्ट इंस्टेंटेशन है, इसलिए यह बहुत ही कुशल और बहुत कम स्मृति का उपयोग करना चाहिए, लेकिन मैंने ऐप-लेवल बनाम विंडो-स्तरीय प्रदर्शन की तुलना करने के लिए कोई प्रोफाइलिंग नहीं की है।

+0

वैसे यह मेरा सवाल था ... यदि आपको कभी भी प्रदर्शन का जवाब पता चलेगा, तो कृपया वापस आने के लिए मत भूलना। – Shimmy

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

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