2012-06-28 29 views
30

मैं उपयोगकर्ता और कस्टम नियंत्रण के बीच अंतर के बारे में कुछ स्पष्टीकरण पढ़ रहा है, उदाहरण के लिए करें: http://www.wpftutorial.net/CustomVsUserControl.htmlकस्टम विरुद्ध उपयोगकर्ता नियंत्रण

मैं बनाना चाहते हैं, उदाहरण के लिए, 2 comboboxes साथ एक datagrid का एक सरल रचना जो डाटाग्रिड के सामानों से मूल्यों को बदलने के लिए जिम्मेदार हैं। मैं इसके लिए एक विशिष्ट नियंत्रण बनाना चाहता हूं क्योंकि मैं इसे कई बार उपयोग करने जा रहा हूं। मैं पीछे तर्क को कार्यान्वित करना चाहता हूं और फिर xaml आमंत्रण में मुझे केवल आइटम स्रोत निर्दिष्ट करना होगा।

इस उदाहरण के लिए मुझे उपयोगकर्ता या कस्टम नियंत्रण बनाना चाहिए? चूंकि मेरे पास गुण और तर्क होंगे, क्या मेरे पास इस नियंत्रण के लिए व्यूमोडल होना चाहिए?

संपादित करें: क्या आप इन 2 विकल्पों के बीच स्पष्ट वैचारिक अलगाव के साथ कुछ लेख जानते हैं?

+0

जहां तक ​​मुझे पता है, कस्टम नियंत्रण केवल उपयोगकर्ता नियंत्रण (या मूल नियंत्रण) संकलित हैं –

+0

@ डेविड ब्रुनेल निश्चित रूप से नहीं। टेम्पलेट के अलग-अलग हैंडलिंग को पहले से ही स्पष्ट करना चाहिए। इसके अलावा UserControl में कोई शैली नहीं हो सकती है, जो लगभग सभी कस्टम नियंत्रणों के लिए महत्वपूर्ण महत्व है। तेज प्रतिक्रिया के लिए – dowhilefor

उत्तर

65

विकल्प न केवल उपयोगकर्ता नियंत्रण और कस्टम नियंत्रण के बीच है, बल्कि उपयोगकर्ता नियंत्रण, कस्टम नियंत्रण, नियंत्रण टेम्पलेट को अनुकूलित करने, डेटा टेम्पलेट को अनुकूलित करने, हेडर टेम्पलेट (संग्रह आधारित नियंत्रणों के लिए), संलग्न गुणों के बीच है। कार्यक्षमता प्राप्त किया जा सकता है, तो मैं संलग्न गुण का उपयोग करें: विचार के निम्न क्रम

  1. संलग्न गुण द्वारा Control Authoring overview

    मैं जाकर देखें। उदाहरण, संख्यात्मक पाठ बॉक्स।

  2. नियंत्रण खाका: आवश्यकता नियंत्रण टेम्पलेट को अनुकूलित करके पूरा किया जा सकता है, तो मैं इस का उपयोग करें। उदाहरण, परिपत्र प्रगति पट्टी।

  3. कस्टम नियंत्रण: यदि नियंत्रण टेम्पलेट ऐसा नहीं कर सकता है, तो मैं कस्टम नियंत्रण का उपयोग करता हूं। बशर्ते मुझे पहले से ही मौजूदा नियंत्रण को अनुकूलित/विस्तारित करने की आवश्यकता है।कम से कम पसंदीदा एक: क्रमबद्ध उपलब्ध कराने के उदाहरण के लिए, छनन

  4. उपयोगकर्ता नियंत्रण (GridView मेट्रो क्षुधा, बस उदाहरण वर्णन करने के लिए प्रयोग किया जाता है में मौजूद है) GridView में शीर्ष लेख पंक्ति के आधार पर। केवल जब रचना की आवश्यकता होती है, और मैं कस्टम नियंत्रण का उपयोग कर ऐसा करने में असमर्थ हूं। आपके उदाहरण की तरह, 2 कम्बोबॉक्स, और 1 डाटाग्रिड। उपयोगकर्ता नियंत्रण निर्बाध लुकलेस फीचर प्रदान नहीं करता है जिसे कस्टम नियंत्रण या नियंत्रण टेम्पलेट के माध्यम से लीवरेज किया जा सकता है।

    एक UserControl आम तौर पर समग्र व्यवहार के कुछ प्रकार encapusulates:

+2

+1 आश्चर्यजनक, मैं कस्टमकंट्रोल और उपयोगकर्ता नियंत्रण स्विच करूँगा, लेकिन अन्यथा यह बिल्कुल सही है कि आपको अपने कस्टम ui तर्क को कैसे कार्यान्वित करना चाहिए। असल में मैं हमेशा एक कस्टम कंट्रोल को अंतिम संभव विकल्प के रूप में देखता हूं, और संलग्न व्यवहार का उपयोग करके कार्यों को करना पसंद करता हूं। – dowhilefor

+0

लापरवाही व्यवहार मुझे उपयोगकर्ता नियंत्रण से दूर रखता है। – Tilak

+0

मुझे भी संलग्न व्यवहार पसंद है। वे कोड क्लीनर बनाता है, लेकिन साथ ही, मुझे अत्यधिक उपयोग करना पसंद नहीं है, जहां संलग्न गुण पर्याप्त हैं, और डोनोट को बहुत नलसाजी की आवश्यकता नहीं है – Tilak

-1

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

<UserControl> 
    Your custom WPF content 
</UserControl> 

मैं पूरी तरह लेख से सहमत नहीं हूं:

UserControl अपने कस्टम सामग्री होने के कारण आधार वर्ग है। हालांकि आपके मामले में आपको UserControl की आवश्यकता है जिसे आप बाद में अपने यूआई में पुनः उपयोग कर सकते हैं।

+0

धन्यवाद। और व्यूमोडेल विकल्प के बारे में कैसे? मैं XAML को यथासंभव सरल बनाना चाहता हूं, और मैं सिर्फ एक सार्वजनिक संपत्ति रखने के बारे में सोच रहा था जो एक आईडी प्राप्त करेगी जिसका उपयोग डेटा प्राप्त करने के लिए व्यावसायिक परत पर कुछ कॉल करने के लिए किया जाएगा। इस स्थिति के लिए मुझे एक व्यूमोडल रखने के लिए समझ में आता है, लेकिन मुझे नहीं पता कि मैं पुन: उपयोग शक्ति खो दूंगा या नहीं। – Louro

+0

@MBen क्षमा करें, शायद मैं आपकी पहली वाक्य को समझ नहीं पा रहा हूं, लेकिन "एक कस्टम contrl बनाने के लिए इसे उपयोगकर्ता नियंत्रण के रूप में लागू करने की आपकी आवश्यकता है", यह स्पष्ट है कि कस्टमकंट्रोल के पास UserControl से कोई लेना देना नहीं है, वास्तव में आप लिख सकते हैं किसी भी UserControls के बिना एक बड़ा आवेदन। इसके अलावा "आपका यूज़र कंट्रोल को कस्टम कंट्रोल कहा जाता है" जो भी गलत है, उपयोगकर्ता कंट्रोल मूल अर्थ में कस्टम कंट्रोल नहीं है, एक डब्ल्यूपीएफ कंट्रोल को वर्गीकृत करना, या आपके अन्य कस्टमकंट्रोल को कस्टमकंट्रोल कहा जाता है। – dowhilefor

+0

@dowhilefor मैं आपसे सहमत हूं। हालांकि मेरे लिए एक कस्टम कंट्रोल एक पूर्व निर्मित नियंत्रण है जिसे अन्य डेवलपर्स द्वारा फिर से उपयोग किया जाएगा। अगर मैं अच्छी तरह से समझ गया तो यह लौरो का मामला है। मैं आपसे सहमत हूं, आप UserControl का उपयोग किए बिना एक बड़ा ऐप बना सकते हैं।UserControl का उपयोग तब किया जाता है जब आप विशेष रूप से यूआई का एक पुन: प्रयोज्य टुकड़ा बनना चाहते हैं। – MBen

0

यदि यह किसी भी तरह आपका पहला समय निर्माण नियंत्रण है, तो मैं उपयोगकर्ता नियंत्रण की सलाह देता हूं क्योंकि वीएस आपको अपने इंटरफ़ेस को अधिक आसानी से डिज़ाइन करने देता है। कस्टम नियंत्रण अधिक शक्तिशाली होते हैं, लेकिन आपको अपने नियंत्रण के तर्क को अपने इंटरफेस से अलग करना होगा और इसके लिए थोड़ा और तैयारी की आवश्यकता होगी।

6

सबसे अच्छा स्पष्टीकरण msdn में है। कस्टमकंट्रोल अधिक "आभासी" नाम है, डब्ल्यूपीएफ में "कस्टमकंट्रोल" नामक कोई कक्षा नहीं है, इसके बजाय इसका मतलब है कि डब्ल्यूपीएफ नियंत्रण कक्षाओं में से एक के ऊपर Control, ItemsControl और TextBox या Button जैसे अधिक विशिष्ट नियंत्रण ।

अपने विशिष्ट मामले के लिए, UserControl पर्याप्त होना चाहिए, कस्टमकंट्रोल बनाना कुछ ऐसा है जो आसानी से टाला जा सकता है। हालांकि यह एक बुरी चीज नहीं है, लेकिन बहुत से लोग, विशेष रूप से WinForms से आने वाले डब्ल्यूपीएफ में शुरुआती होने के बाद ज़्यादा ज़रूरी हो जाते हैं।

25

आप पहले से ही कुछ महान जवाब है कि अन्तर को स्पष्ट करती है लेकिन यह भी समझते हैं कि कस्टम नियंत्रण और UserControls विभिन्न प्रयोजनों होता है। यदि आपके पास एक ऐसा एप्लिकेशन है जिसे कई स्थानों पर संपर्क विवरण संपादित करने की आवश्यकता है, उदाहरण के लिए, आप एक कस्टम नियंत्रण बना सकते हैं जिसमें सबमिट बटन के साथ रखे गए सभी डेटा के लिए लेबल और टेक्स्ट फ़ील्ड्स हैं, जिनमें प्रासंगिक कोड है और इस नियंत्रण का पुन: उपयोग करें अपने पूरे आवेदन में।

एक कस्टम नियंत्रण एक नियंत्रण है जो WPF नियंत्रण कक्षाओं (ईजी Control, ContentControl इत्यादि) में से एक से लिया गया है और कोड में बनाया जाना है। इन नियंत्रणों में आमतौर पर एक समग्र संयोजन (लगता है TextBox, ComboBox, Label) पूरी तरह से एक साथ काम करने की बजाय (हालांकि यह मामला नहीं होना चाहिए)।

UserControl आमतौर पर WPF से अपरिचित लोगों के लिए आसान होता है क्योंकि उन्हें दृष्टि से डिज़ाइन किया जा सकता है।

मेरा सुझाव UserControl से शुरू करना होगा। WPF कामों के तरीके से आप अधिक परिचित हो जाते हैं, तो आप इसे बाद में किसी कस्टम नियंत्रण में रीफैक्टर कर सकते हैं। कस्टम नियंत्रण के रूप में अपना नियंत्रण बनाना को ControlTemplate एस और Style के ज्ञान की आवश्यकता होगी क्योंकि आपको अपना नियंत्रण देखने और महसूस करने के लिए अपना खुद का प्रदान करने की आवश्यकता होगी।

जब सब कुछ कहा और किया जाता है, जब तक कि नियंत्रण सही तरीके से व्यवहार करता है, इससे कोई फर्क नहीं पड़ता कि आप किस दृष्टिकोण का उपयोग करते हैं।

एक ही समस्या के दो दृष्टिकोणों के उदाहरण के लिए this पोस्ट देखें। पोस्ट लेखक एक नियंत्रण चाहता था जो प्राथमिक सामग्री के सामने मोडल सामग्री पेश कर सकता है। पोस्ट लेखक ने वास्तव में UserControl के रूप में इसे लागू करके अपने स्वयं के प्रश्न का उत्तर दिया। मैंने उस पोस्ट का उत्तर जोड़ा है जो नियंत्रण को कस्टम नियंत्रण के रूप में बनाता है लेकिन दोनों का एक ही अंत प्रभाव होता है।

1

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

आप आसानी से दिखने में CustomControl डिज़ाइन कर सकते हैं। नया UserControl (या विंडो) बनाएं। डिजाइनर में दृष्टि से अपनी xaml संरचना बनाएँ। परिणामी xaml के ControlTemplate के अंदर अपने नए CustomControl (सामान्य थीम फ़ाइल में) के अंदर कॉपी-पेस्ट बॉडी।

यदि मुझे सही याद है, तो आप ब्लेंड में सीधे कस्टम कंट्रोल टेम्पलेट को डिज़ाइन करने में भी सक्षम हैं।

बेशक आप खिड़की में कस्टम कंट्रोल को भी मिटा सकते हैं और विंडो के डिज़ाइनर व्यू को विजुअलस्टूडियो में नियंत्रण के xaml व्यू के ऊपर नए पैनल के रूप में रख सकते हैं। शैली टेम्पलेट से कुछ xaml बाइंडिंग इस तरह के डिजाइनर में दिखाई नहीं देते हैं, जब तक कि मैं पुनर्निर्माण नहीं करता।

[इम्हो जीयूआई मुख्य रूप से एक दृश्य पदार्थ है और इसे कोड में नहीं बनाया जाना चाहिए, और इसकी आवश्यकता नहीं है। ]

-1

तुम हमेशा आत्म व्याख्यात्मक, माइक्रोसॉफ्ट शैली विवरण पर भरोसा कर सकते हैं:

उपयोगकर्ता नियंत्रण (WPF) - विंडोज प्रस्तुति फाउंडेशन उपयोगकर्ता नियंत्रण
कस्टम नियंत्रण (WPF) - विंडोज प्रस्तुति फाउंडेशन कस्टम नियंत्रण

+0

हाहा, बहुत मजाकिया :) –

4
  • आप एक दृश्य मॉडल है और आप एक दृश्य बनाने के लिए यह उपयोगकर्ता के नियंत्रण का उपयोग के लिए चाहते हैं।

  • आप एक स्वायत्त नियंत्रण कोई विशेष दृश्य-मॉडल है कि जरूरत है,
    आप शायद एक कस्टम नियंत्रण की जरूरत है।

  • आप पाते हैं कि कार्यक्षमता आप पूरे के रूप में की जरूरत है, पहले से ही अन्य नियंत्रण में मौजूद यदि आप किसी मौजूदा नियंत्रण टेम्पलेट ओवरराइड करने के लिए की जरूरत है।
    (यानी: एक हीरे के आकार बटन के लिए - आप बटन नियंत्रण टेम्पलेट ओवरराइड करने के लिए की जरूरत है।)

  • संलग्न-गुण और संलग्न-व्यवहार के बारे में

    , उन उपयोगी यदि आप एक नियंत्रण है जो आप का विस्तार करना चाहते हैं जब कर रहे हैं अधिक गुणों के साथ या आप इसे अपने डिफ़ॉल्ट व्यवहार से थोड़ा अलग व्यवहार करना चाहते हैं।

ओपी वर्णित संरचना के प्रदान किए गए मामले में, इसे उपयोगकर्ता नियंत्रण या कस्टम नियंत्रण के साथ हासिल किया जा सकता है। मैं कस्टम नियंत्रण पसंद करूंगा क्योंकि कोई विशिष्ट दृश्य मॉडल प्रदान नहीं किया गया है, "इनपुट" केवल एक आइटम संग्रह से जुड़ी एक संपत्ति है।

ओह, और, मुझे थोड़ी देर के लिए खेद है।