टेक्स्टबॉक्स में इनपुट प्रतिबंधित करने के लिए राज्य मशीनों का उपयोग कर विजुअल स्टूडियो सी #। पाठ इनपुट को प्रतिबंधित करने के लिए संलग्न गुण

बच्चों के लिए एंटीपीयरेटिक्स एक बाल रोग विशेषज्ञ द्वारा निर्धारित किया जाता है। लेकिन बुखार के लिए आपातकालीन स्थितियां होती हैं जब बच्चे को तुरंत दवा देने की आवश्यकता होती है। तब माता-पिता जिम्मेदारी लेते हैं और ज्वरनाशक दवाओं का उपयोग करते हैं। शिशुओं को क्या देने की अनुमति है? आप बड़े बच्चों में तापमान कैसे कम कर सकते हैं? कौन सी दवाएं सबसे सुरक्षित हैं?

डब्ल्यूपीएफ बाजार में एक नई तकनीक होने से बहुत दूर है, लेकिन मेरे लिए अपेक्षाकृत नया है। और, जैसा कि अक्सर कुछ नया सीखते समय होता है, कुछ विशिष्ट कार्यों को हल करने के लिए चौकोर पहियों और मिश्र धातु के पहियों वाली साइकिलों का आविष्कार करने की इच्छा / आवश्यकता होती है।

ऐसा ही एक कार्य उपयोगकर्ता इनपुट को कुछ डेटा तक सीमित करना है। उदाहरण के लिए, मान लें कि हम चाहते हैं कि एक टेक्स्ट बॉक्स केवल पूर्णांक मानों को स्वीकार करे, दूसरा किसी निश्चित प्रारूप में दिनांक को स्वीकार करे, और एक तिहाई केवल फ़्लोटिंग पॉइंट नंबर स्वीकार करे। बेशक, इस तरह के मूल्यों का अंतिम सत्यापन अभी भी दृश्य मॉडल में होगा, लेकिन इस तरह के इनपुट प्रतिबंध उपयोगकर्ता इंटरफ़ेस को अधिक अनुकूल बनाते हैं।

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

टिप्पणी
यदि आप मेरे तर्क में बहुत रुचि नहीं रखते हैं, लेकिन आपको तुरंत कोड उदाहरणों की आवश्यकता है, तो आप या तो पूरी परियोजना को डाउनलोड कर सकते हैं
GitHub से WpfEx , या मुख्य कार्यान्वयन डाउनलोड करें, जो इसमें निहित है TextBoxBehavior.cs और TextBoxDoubleValidator.cs ।

अच्छा, चलिए शुरू करते हैं?

चूंकि वंशानुक्रम एक सख्त प्रतिबंध का परिचय देता है, इसलिए मैं व्यक्तिगत रूप से इस मामले में संलग्न गुणों का उपयोग करना पसंद करता हूं, क्योंकि यह तंत्र आपको इन गुणों के अनुप्रयोग को एक निश्चित प्रकार के नियंत्रण तक सीमित रखने की अनुमति देता है (मुझे यह संलग्न संपत्ति नहीं चाहिए डबल हैटेक्स्टब्लॉक पर लागू किया जा सकता है जिसके लिए इसका कोई मतलब नहीं है)।
इसके अलावा, यह ध्यान दिया जाना चाहिए कि उपयोगकर्ता इनपुट को प्रतिबंधित करते समय, आप किसी विशिष्ट पूर्णांक और भिन्नात्मक विभाजक (जैसे '।' (डॉट) या ',' (अल्पविराम)) का उपयोग नहीं कर सकते हैं, साथ ही साथ '+' और ' -', क्योंकि यह सब उपयोगकर्ता की क्षेत्रीय सेटिंग्स पर निर्भर करता है।
डेटा इनपुट को प्रतिबंधित करने की क्षमता को लागू करने के लिए, हमें उपयोगकर्ता इनपुट ईवेंट को हाथ से रोकना होगा, उसका विश्लेषण करना होगा और यदि वे हमारे अनुरूप नहीं हैं तो इन परिवर्तनों को त्याग दें। विंडोज फॉर्म के विपरीत, जो घटनाओं की एक जोड़ी का उपयोग करता है XXX बदल गयातथा XXXबदलना, डब्ल्यूपीएफ उसी उद्देश्य के लिए घटनाओं के पूर्वावलोकन संस्करणों का उपयोग करता है, जिसे इस तरह से संसाधित किया जा सकता है कि मुख्य घटना आग नहीं लगती है। (एक उत्कृष्ट उदाहरण माउस या कीबोर्ड ईवेंट को संभालना होगा जो कुछ कुंजियों या उनके संयोजनों को अक्षम करते हैं।)

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

समस्या का समाधान

समस्या का समाधान टेक्स्टबॉक्सबिहेवियर क्लास बनाना है जिसमें संलग्न IsDoubleProperty प्रॉपर्टी है, जिसे सेट करने के बाद उपयोगकर्ता इस टेक्स्ट फ़ील्ड में +, -, वर्णों के अलावा कुछ भी दर्ज नहीं कर पाएगा। (पूर्णांक और भिन्नात्मक भागों का विभाजक), साथ ही साथ संख्याएँ (यह मत भूलो कि हमें वर्तमान स्ट्रीम की सेटिंग्स का उपयोग करने की आवश्यकता है, न कि हार्डकोडेड मानों की)।

पब्लिक क्लास टेक्स्टबॉक्सबिहेवियर (// बूलियन प्रकार की संलग्न संपत्ति, सेटिंग जो उपयोगकर्ता इनपुट को सार्वजनिक स्थैतिक रीडोनली डिपेंडेंसीप्रॉपर्टी IsDoubleProperty = DependencyProperty.RegisterAttached("IsDouble", typeof (bool), typeof (TextBoxBehavior), new FrameworkPropertyMetadata(false, OnIsDoubleChanged)) को प्रतिबंधित करेगी। ;//यह विशेषता IsDouble को टेक्स्टबॉक्स या उसके वंशज सार्वजनिक स्थैतिक बूल GetIsDouble (निर्भरता ऑब्जेक्ट तत्व) के अलावा किसी भी // UI तत्वों के साथ उपयोग करने की अनुमति नहीं देगी () सार्वजनिक स्थैतिक शून्य SetIsDouble (निर्भरता ऑब्जेक्ट तत्व, बूल मान) () // कॉल किया गया जब TextBoxBehavior.IsDouble="True" XAML निजी स्थैतिक शून्य में सेट किया गया है OnIsDoubleChanged (निर्भरताऑब्जेक्ट डी, डिपेंडेंसीप्रॉपर्टीचेंजडएवेंटएआरजीएस ई) (// स्ट्रीट मैजिक))

हैंडलर कार्यान्वयन की मुख्य जटिलता प्रीव्यूटेक्स्टइनपुट(साथ ही क्लिपबोर्ड से पाठ चिपकाने की घटना) इस तथ्य में निहित है कि पाठ का कुल मूल्य घटना तर्कों में प्रेषित नहीं होता है, बल्कि इसका केवल नया दर्ज किया गया हिस्सा होता है। इसलिए, टेक्स्टबॉक्स में टेक्स्ट के चयन की संभावना, उसमें कर्सर की वर्तमान स्थिति और, संभवतः, इन्सर्ट बटन की स्थिति (जिसका हम विश्लेषण नहीं करेंगे) को ध्यान में रखते हुए, सारांश टेक्स्ट को मैन्युअल रूप से बनाया जाना चाहिए:

// कॉल किया जाता है जब TextBoxBehavior.IsDouble="True" XAML निजी स्थैतिक शून्य में सेट किया गया है OnIsDoubleChanged (निर्भरता ऑब्जेक्ट डी, निर्भरताप्रॉपर्टी चेंज इवेंटअर्ग ई) (// चूंकि हमने अपनी संलग्न संपत्ति को केवल // टेक्स्टबॉक्स वर्ग या उसके वंशजों तक सीमित कर दिया है, निम्नलिखित परिवर्तन है - सुरक्षित वर टेक्स्टबॉक्स = (टेक्स्टबॉक्स) डी; // अब हमें दो महत्वपूर्ण मामलों को संभालने की आवश्यकता है: // 1. मैनुअल उपयोगकर्ता इनपुट // 2. क्लिपबोर्ड टेक्स्टबॉक्स से डेटा पेस्ट करना। टेक्स्टबॉक्स, ऑनपेस्टफॉरडबल); )

टेक्स्टबॉक्स डबल वैलिडेटर क्लास

दूसरा महत्वपूर्ण बिंदु नए दर्ज किए गए पाठ के सत्यापन के तर्क का कार्यान्वयन है, जिसके लिए जिम्मेदारी विधि को सौंपी गई है यह सही हैअलग वर्ग टेक्स्टबॉक्स डबल वैलिडेटर.

सबसे द्वारा सरल तरीके सेसमझें कि विधि को कैसे व्यवहार करना चाहिए यह सही हैइस वर्ग के लिए, इसके लिए एक इकाई परीक्षण लिखना है जो सभी कोने के मामलों को कवर करेगा (यह उन मामलों में से एक है जब पैरामीटरयुक्त इकाई परीक्षण भयानक बल के साथ शासन करते हैं):

टिप्पणी
यह ठीक वैसा ही मामला है जब एक इकाई परीक्षण केवल एक परीक्षण नहीं है जो कुछ कार्यक्षमता के कार्यान्वयन की शुद्धता की जांच करता है। जवाबदेही का वर्णन करते समय केंट बेक ने ठीक यही बात बार-बार की; इस परीक्षण को पढ़कर, आप समझ सकते हैं कि सत्यापन पद्धति के विकासकर्ता क्या सोच रहे थे, अपने ज्ञान का "पुन: उपयोग" करें और अपने तर्क में त्रुटियां पाएं और इस प्रकार, शायद कार्यान्वयन कोड में। यह सिर्फ एक परीक्षण सूट नहीं है - यह इस पद्धति के विनिर्देश का एक महत्वपूर्ण हिस्सा है!

निजी स्थैतिक शून्य पूर्वावलोकनTextInputForDouble (ऑब्जेक्ट प्रेषक, TextCompositionEventArgs e) (// e.Text में केवल नया टेक्स्ट होता है, इसलिए टेक्स्टबॉक्स की वर्तमान // स्थिति अपरिहार्य है var textBox = (TextBox)sender; string fullText; // यदि टेक्स्टबॉक्स में शामिल है चयनित टेक्स्ट, फिर इसे e.Text से बदलें यदि (textBox.SelectionLength > 0) ( fullText = textBox.Text.Replace(textBox.SelectedText, e.Text); ) अन्य (//अन्यथा, हमें नया टेक्स्ट डालने की आवश्यकता है कर्सर स्थिति fullText = textBox.Text.Insert(textBox.CaretIndex, e.Text); ) // अब प्राप्त टेक्स्ट बूल को मान्य करें isTextValid = TextBoxDoubleValidator.IsValid (fullText); // और टेक्स्ट नहीं होने पर टेक्स्ट चेंज किए गए ईवेंट को रोकें मान्य e.Handled = !isTextValid; )

परीक्षण विधि वापस आती है सचयदि पैरामीटर मूलपाठमान्य है, जिसका अर्थ है कि संबंधित पाठ को टाइप किया जा सकता है पाठ बॉक्ससंलग्न संपत्ति के साथ डबल है। कुछ बातों पर ध्यान दें: (1) विशेषता का उपयोग संस्कृति सेट करें, जो वांछित लोकेल सेट करता है और (2) कुछ इनपुट मान, जैसे "-।", जो प्रकार के लिए मान्य मान नहीं हैं दोहरा.

एक स्पष्ट लोकेल सेटिंग की आवश्यकता है ताकि अन्य व्यक्तिगत सेटिंग्स वाले डेवलपर्स के लिए परीक्षण विफल न हों, क्योंकि रूसी लोकेल में, प्रतीक ',' (अल्पविराम) का उपयोग विभाजक के रूप में किया जाता है, और अमेरिकी में - '।' (डॉट) ) अजीब पाठ जैसे "-।" सही है क्योंकि हमें उपयोगकर्ता को इनपुट पूरा करने की आवश्यकता है यदि वे स्ट्रिंग "-.1" दर्ज करना चाहते हैं, जो कि सही मान है दोहरा. (दिलचस्प बात यह है कि StackOverflow को अक्सर इस समस्या को हल करने के लिए Double.TryParse का उपयोग करने की सलाह दी जाती है, जो स्पष्ट रूप से कुछ मामलों में काम नहीं करेगा)।

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

वैकल्पिक समाधान

घटनाओं को कैप्चर करने के अलावा प्रीव्यूटेक्स्टइनपुटऔर क्लिपबोर्ड से टेक्स्ट पेस्ट करना, अन्य समाधान भी हैं। इसलिए, उदाहरण के लिए, मुझे घटना को रोककर उसी समस्या को हल करने का प्रयास मिला पूर्वावलोकनकुंजीडाउनडिजिटल को छोड़कर सभी चाबियों को छानने के साथ। हालाँकि, यह समाधान अधिक जटिल है, क्योंकि आपको अभी भी टेक्स्टबॉक्स की "सारांश" स्थिति से परेशान होना पड़ता है, और विशुद्ध रूप से सैद्धांतिक रूप से, पूर्णांक और भिन्नात्मक भागों का विभाजक एक वर्ण नहीं, बल्कि संपूर्ण स्ट्रिंग (NumberFormatInfo.NumberDecimalSeparator) हो सकता है। रिटर्न डोरी, लेकिन नहीं चारो).
घटना में एक और विकल्प है चाबी नीचेपिछली स्थिति सहेजें टेक्स्टबॉक्स। टेक्स्ट, और घटना में पाठ परिवर्तितयदि नया मान सूट नहीं करता है तो पुराने मान को वापस कर दें। लेकिन यह समाधान अप्राकृतिक दिखता है, और संलग्न गुणों का उपयोग करके इसे लागू करना इतना आसान नहीं होगा।

निष्कर्ष

जब हमने पिछली बार सहकर्मियों के साथ डब्ल्यूपीएफ में उपयोगी और बहुत विशिष्ट सुविधाओं की कमी पर चर्चा की, तो हम इस निष्कर्ष पर पहुंचे कि इसके लिए एक स्पष्टीकरण है, और इसका एक सकारात्मक पक्ष है। स्पष्टीकरण इस तथ्य तक उबाल जाता है कि लीकी अबास्ट्रक्शन के कानून से कोई बच नहीं है, और डब्ल्यूपीएफ, एक बहुत ही जटिल "अमूर्त" होने के नाते, एक चलनी की तरह बहती है। उपयोगी पक्ष यह है कि कुछ उपयोगी सुविधाओं की कमी हमें कभी-कभी सोचने पर मजबूर कर देती है (!) और यह न भूलें कि हम प्रोग्रामर हैं, कॉपी-पेस्ट शिल्पकार नहीं।

आपको याद दिला दूं कि उपरोक्त वर्गों की कक्षाओं का पूर्ण कार्यान्वयन, उनके उपयोग के उदाहरण और इकाई परीक्षण जीथब पर पाए जा सकते हैं।

टैग: टैग जोड़ें

इस मैनुअल में, हम उपयोगकर्ता से केवल नंबर दर्ज करने पर विचार करेंगे। पर माइक्रोसॉफ्ट विजुअल स्टूडियोएक नियंत्रण है" नकाबपोश टेक्स्टबॉक्स”, इसके अनुकूलन योग्य इनपुट मास्क के साथ, लेकिन हम मान लेंगे कि आज हम केवल इसमें रुचि रखते हैं« पाठ बॉक्स».
इस कार्य को लागू करने के लिए, हम घटना का उपयोग करेंगे " बटन दबाओ" यह तब होता है जब नियंत्रण में फ़ोकस होने पर कोई कुंजी दबाया जाता है। एक प्रोजेक्ट बनाएं विंडोज़ फॉर्ममें माइक्रोसॉफ्ट विजुअल स्टूडियोऔर मुख्य रूप में नियंत्रण जोड़ें पाठ बॉक्स". इस घटक का चयन करें और उस पर राइट-क्लिक करें, दिखाई देने वाले संदर्भ मेनू से आइटम का चयन करें " गुणबटन दबाओटेक्स्टबॉक्स1_कीप्रेस", विकास " बटन दबाओ».
हर घटना के साथ बटन दबाओ» पारित वस्तु « KeyPressEventArgs". इस वस्तु में संपत्ति शामिल है " कीचार"दबाए गए कुंजी के चरित्र का प्रतिनिधित्व करना। उदाहरण के लिए, SHIFT + D कुंजियों को दबाने पर, यह गुण पूंजी वर्ण D और उसका कोड 68 लौटाता है। एक गुण भी है " संभाला' जिसका उपयोग यह निर्धारित करने के लिए किया जाता है कि घटना को संभाला गया है या नहीं। मान सेट करके " संभाला" में " सच", इनपुट ईवेंट नहीं भेजा जाएगा ऑपरेटिंग सिस्टमडिफ़ॉल्ट प्रसंस्करण के लिए।
आइए टेक्स्ट फ़ील्ड में डेटा प्रविष्टि प्रतिबंध बनाने के कुछ उदाहरण देखें।
उदाहरण 1:
टेक्स्टबॉक्स 1_कीप्रेस"।

अगर ((e.KeyChar<= 47 || e.KeyChar >= 58) && e. KeyChar != 8) e.Handled = true; इस उदाहरण में तार्किक ऑपरेटरों का उपयोग करते हुए यौगिक स्थितियां शामिल हैं जैसे कि &&(तथा), || (या), ! (नहीं)और दो शर्तों के अनुसार दर्ज किए गए वर्ण के दशमलव कोड की जाँच करता है:

  • "e.KeyChar != 8" - यदि "बैकस्पेस" कुंजी दबाया गया था, तो वर्ण हटाने की अनुमति दें।
  • "(e. KeyChar<= 47 || ई.कीचर >= 58 )" - यदि दर्ज किए गए वर्ण में ASCII कोड 47 से कम या उसके बराबर और 58 से अधिक या उसके बराबर है, तो इनपुट निषिद्ध है।
नीचे है ASCII कोड तालिकाजिसमें वर्णों को लाल रंग से हाइलाइट किया जाता है, जिसका प्रवेश वर्जित है और हरे रंग में, जिसकी प्रविष्टि की अनुमति है।

उदाहरण 2:
निम्नलिखित सूची को " टेक्स्टबॉक्स1_कीप्रेस».
if (!Char.IsDigit(e.KeyChar) && e.KeyChar != Convert.ToChar(8)) (e.Handled = true;) यह उदाहरण तार्किक ऑपरेटरों का भी उपयोग करता है जैसे कि &&(तथा), ! (नहीं)और दर्ज किए गए वर्ण का दशमलव कोड दो स्थितियों के अनुसार जाँचा जाता है। जाँच करने के लिए विधि का उपयोग किया जाता है चार.IsDigit", जो लौटता है" सच"" यदि दर्ज किया गया यूनिकोड वर्ण दशमलव अंक है और " असत्य", अगर नहीं। कुंजी दबाने के लिए एक चेक भी है " बैकस्पेस».
उदाहरण 3:
अगर (!(Char.IsDigit(e.KeyChar)) && !((e.KeyChar == ".") && (((टेक्स्टबॉक्स) प्रेषक)। टेक्स्ट। इंडेक्सऑफ ("।") == -1) && ( ((पाठ बॉक्स) प्रेषक)। पाठ। लंबाई! = 0))) (अगर (e.KeyChar!= (char)Keys.Back) (e.Handled = true;)) इस उदाहरण में, साथ ही पिछले एक में, इनपुट वर्ण के कोड की जाँच " चार.IsDigit”, लेकिन एक अतिरिक्त शर्त है जो एक के इनपुट की अनुमति देती है दशमलव विभाजक. इसके लिए विधि का प्रयोग किया जाता है टेक्स्ट.इंडेक्सऑफ". यह विधि वर्तमान संस्कृति का उपयोग करते हुए शब्दों द्वारा अवधि वर्ण की खोज करती है। खोज इस उदाहरण (वर्तमान पंक्ति) में पहली वर्ण स्थिति से शुरू होती है और अंतिम वर्ण स्थिति तक जारी रहती है। यदि दिया गया प्रतीक नहीं मिला, तो विधि मान लौटाती है " -1 ". यदि प्रतीक पाया गया था, तो विधि एक दशमलव पूर्णांक लौटाती है जो दिए गए प्रतीक की स्थिति को दर्शाता है और प्रतीक के इनपुट के प्रसंस्करण को प्रतिबंधित करता है।

दशमलव विभाजक- दशमलव प्रणाली में दशमलव भिन्न के रूप में एक वास्तविक संख्या के पूर्णांक और भिन्नात्मक भागों को अलग करने के लिए प्रयुक्त चिह्न। अन्य संख्या प्रणालियों में भिन्नों के लिए, पूर्णांक के शब्द विभाजक और किसी संख्या के भिन्नात्मक भागों का उपयोग किया जा सकता है। कभी-कभी दशमलव बिंदु और दशमलव बिंदु शब्दों का भी उपयोग किया जा सकता है। (http://ru.wikipedia.org)।
विधि के बारे में अधिक जानकारी के लिए टेक्स्ट.इंडेक्सऑफ» आप यहां प्राप्त कर सकते हैं: http://msdn.microsoft.com।

उदाहरण 4:
निम्नलिखित सूची को " टेक्स्टबॉक्स1_कीप्रेस».

if (!System.Text.RegularExpressions.Regex.Match(e.KeyChar.ToString(), @"").Success) (e.Handled = true; ) इनपुट वर्णों की जाँच करने के लिए, इस उदाहरण में, विधि " रेगेक्स मैच". यह विधि दिए गए रेगुलर एक्सप्रेशन की सभी घटनाओं के लिए इनपुट स्ट्रिंग की खोज करती है। एक नियमित अभिव्यक्ति एक चरित्र पैटर्न है जो मनमाने ढंग से लंबाई के वर्णों के अनुक्रम का प्रतिनिधित्व करती है। आप कोई भी रेगुलर एक्सप्रेशन निर्दिष्ट कर सकते हैं, उदाहरण के लिए, केवल वर्णों को अनुमति दें " 'या दशमलव विभाजक के इनपुट की अनुमति दें' ,|.| ».
उदाहरण 5:
निम्नलिखित सूची को " टेक्स्टबॉक्स1_कीप्रेस».

if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(),@"\d+")) e.Handled = true; यह उदाहरण दर्ज किए गए वर्ण के सत्यापन को लागू करने के लिए दिए गए नियमित अभिव्यक्ति का भी उपयोग करता है। नियमित अभिव्यक्ति का उपयोग करता है " + ”, जिसका अर्थ है कि एक ही प्रकार के एक या अधिक वर्ण पाए जाने हैं। उदाहरण के लिए, \d+"1", "11", "1234", आदि संख्याओं से मेल खाता है। यदि आप सुनिश्चित नहीं हैं कि कौन सी संख्याएँ संख्या का अनुसरण करेंगी? आप निर्दिष्ट कर सकते हैं कि या तो अंकों की कोई भी संख्या या अंकों की अनुमति नहीं है। इसके लिए प्रतीक " * ».
उदाहरण 6:
इस उदाहरण को लागू करने के लिए, आपको ईवेंट का उपयोग करने की आवश्यकता है " चाबी नीचे", नियंत्रण तत्व" टेक्स्टबॉक्स1". मुख्य फॉर्म कंस्ट्रक्टर पर जाएं और घटक का चयन करें " टेक्स्टबॉक्स1". इस नियंत्रण पर राइट-क्लिक करें, दिखाई देने वाले संदर्भ मेनू से आइटम का चयन करें " गुण". खुलने वाली विंडो में, घटक ईवेंट (विंडो के शीर्ष पर लाइटनिंग बोल्ट आइकन) पर जाएं और ईवेंट ढूंढें " चाबी नीचे”, इस घटना पर डबल क्लिक करें। सभी चरणों को पूरा करने के बाद, आप स्वचालित रूप से उत्पन्न विधि पर जाएंगे " टेक्स्टबॉक्स1_कीडाउन", विकास " चाबी नीचे". यह घटना हर बार तब होती है जब नियंत्रण में फोकस होने पर कोई कुंजी दबाया जाता है।

कीबोर्ड इनपुट इवेंट

जब उपयोगकर्ता एक कुंजी दबाता है, तो घटनाओं की एक श्रृंखला निकाल दी जाती है। तालिका इन घटनाओं को उनके घटित होने के क्रम में सूचीबद्ध करती है:

घटनाओं के घटित होने का कालक्रम
नाम रूटिंग प्रकार विवरण
पूर्वावलोकनकुंजीडाउन सुरंग तब होता है जब एक कुंजी दबाया जाता है।
चाबी नीचे बुलबुला फैल गया वैसा ही
प्रीव्यूटेक्स्टइनपुट सुरंग तब होता है जब एक कीस्ट्रोक पूरा हो जाता है और तत्व टेक्स्ट इनपुट प्राप्त करता है। यह घटना उन कुंजियों के लिए नहीं होती है जो वर्णों को "प्रिंट" नहीं करती हैं (उदाहरण के लिए, यह तब नहीं होता है जब कुंजियाँ दबाई जाती हैं , , , कर्सर कुंजियाँ, फ़ंक्शन कुंजियाँ, आदि)
पाठ इनपुट बुलबुला फैल गया वैसा ही
पूर्वावलोकनकीअप सुरंग तब होता है जब कोई कुंजी जारी की जाती है
तनाव के स्थिति में बुलबुला फैल गया वैसा ही

कीबोर्ड ईवेंट को संभालना किसी भी तरह से उतना आसान नहीं है जितना यह लग सकता है। कुछ नियंत्रण इन घटनाओं में से कुछ को अपने स्वयं के कीबोर्ड से निपटने के लिए ब्लॉक कर सकते हैं। सबसे उल्लेखनीय उदाहरण टेक्स्टबॉक्स तत्व है, जो टेक्स्टइनपुट ईवेंट के साथ-साथ कीडाउन ईवेंट को कुछ कुंजियों को दबाने के लिए ब्लॉक करता है, जैसे कि कर्सर कुंजियाँ। ऐसे मामलों में, आप आमतौर पर अभी भी टनल किए गए ईवेंट (PreviewTextInput और PreviewKeyDown) का उपयोग कर सकते हैं।

टेक्स्टबॉक्स तत्व एक नया ईवेंट जोड़ता है, टेक्स्ट चेंज किया गया। कीस्ट्रोक के टेक्स्ट फ़ील्ड में टेक्स्ट बदलने के तुरंत बाद यह घटना सक्रिय हो जाती है। हालांकि, इस समय, नया टेक्स्ट टेक्स्ट फ़ील्ड में पहले से ही दिखाई दे रहा है, इसलिए अवांछित कीस्ट्रोक को पूर्ववत करने में बहुत देर हो चुकी है।

कीस्ट्रोक हैंडलिंग

यह समझना कि कीबोर्ड ईवेंट कैसे काम करते हैं और उनका उपयोग कैसे किया जाता है, एक उदाहरण के साथ सबसे अच्छा किया जाता है। निम्नलिखित एक उदाहरण प्रोग्राम है जो सभी संभावित कीस्ट्रोक्स पर नज़र रखता है और लॉग करता है जबकि टेक्स्ट फ़ील्ड में फ़ोकस होता है। इस स्थिति में, एक कैपिटल S टाइप करने का परिणाम दिखाया जाता है।

यह उदाहरण एक महत्वपूर्ण बिंदु को प्रदर्शित करता है। प्रीव्यूकीडाउन और कीडाउन इवेंट हर बार कुंजी दबाए जाने पर उठाए जाते हैं। हालांकि, टेक्स्ट इनपुट ईवेंट केवल तभी सक्रिय होता है जब कोई चरित्र तत्व में "इनपुट" होता है। वास्तव में, इसका मतलब कई कुंजियों को दबाने से हो सकता है। उदाहरण में, आपको प्राप्त करने के लिए दो कुंजियाँ दबाने की आवश्यकता है बड़ा अक्षरएस: कुंजी पहले , और फिर कुंजी . इसके परिणामस्वरूप दो कीडाउन और कीअप इवेंट होते हैं, लेकिन केवल एक टेक्स्टइनपुट इवेंट होता है।

बार-बार कैरेक्टर प्रेस पर ध्यान न दें

सार्वजनिक आंशिक वर्ग मेनविंडो: विंडो (सार्वजनिक मेनविंडो () (InitializeComponent ();) निजी शून्य Clear_Click (ऑब्जेक्ट प्रेषक, रूटेडएवेंटआर्ग ई) (lbxEvents.Items.Clear (); txtContent.Clear (); i = 0;) संरक्षित int i = 0; निजी शून्य KeyEvents (वस्तु प्रेषक, KeyEventArgs e) (यदि ((बूल) chkIgnoreRepeat.Ischecked && e.IsRepeat) वापसी; i++; स्ट्रिंग s = "ईवेंट" + i + ":" + e.RoutedEvent + "कुंजी : "+ e.Key; lbxEvents.Items.Add(s); ) निजी शून्य TextInputEvent (ऑब्जेक्ट प्रेषक, TextCompositionEventArgs e) (i++; स्ट्रिंग s = "इवेंट" + i + ":" + e.RoutedEvent + "कुंजी: "+ e.Text; lbxEvents.Items.Add(s); ) )

PreviewKeyDown, KeyDown, PreviewKey, और KeyUp ईवेंट प्रत्येक KeyEventArgs ऑब्जेक्ट को समान जानकारी देते हैं। सबसे महत्वपूर्ण हिस्सा कुंजी गुण है, जो System.Windows.Input.Key एन्यूमरेशन से एक मान लौटाता है और दबाए गए या जारी की गई कुंजी की पहचान करता है।

कुंजी मान किसी अन्य कुंजी की स्थिति को ध्यान में नहीं रखता है - उदाहरण के लिए, क्या कुंजी दबाया गया था दबाने के समय ; किसी भी तरह से आपको वही Key (Key.S) मान मिलेगा।

यहां एक कठिनाई है। आपका विंडोज कीबोर्ड कैसे सेट किया जाता है, इस पर निर्भर करते हुए, एक कुंजी को दबाए रखने से कुंजी को थोड़े समय के बाद फिर से दबाया जा सकता है। उदाहरण के लिए, एक कुंजी दबाकर टेक्स्ट फ़ील्ड में S वर्णों की एक श्रृंखला दर्ज करने का कारण होगा। इसी तरह, कुंजी दबाकर बार-बार क्लिक और कीडाउन घटनाओं की एक श्रृंखला में परिणाम। एक वास्तविक उदाहरण में, संयोजन को दबाते समय टेक्स्ट फ़ील्ड कुंजी के लिए कीडाउन ईवेंट की एक श्रृंखला उत्पन्न करेगा , फिर कुंजी के लिए कीडाउन इवेंट , टेक्स्ट इनपुट इवेंट (या टेक्स्ट चेंजेड इवेंट के मामले में पाठ का क्षेत्र) और फिर कुंजियों के लिए KeyUp ईवेंट तथा . यदि आप कीस्ट्रोक्स को अनदेखा करना चाहते हैं , आप KeyEventArgs.IsRepeat प्रॉपर्टी का उपयोग करके जांच सकते हैं कि प्रेस एक कुंजी प्रेस का परिणाम है या नहीं।

PreviewKeyDown, KeyDown, PreviewKey, और KeyUp ईवेंट कीबोर्ड इनपुट को संभालने के लिए निम्न-स्तरीय कोड लिखने के लिए अधिक उपयुक्त हैं (जिसकी शायद ही कभी आवश्यकता होती है, उपयोगकर्ता नियंत्रण को छोड़कर) और विशेष कुंजी प्रेस (जैसे फ़ंक्शन कुंजियाँ) को संभालने के लिए।

KeyDown ईवेंट के बाद PreviewTextInput ईवेंट होता है। (टेक्स्टइनपुट ईवेंट नहीं उठाया गया है क्योंकि टेक्स्टबॉक्स इसे अवरुद्ध कर रहा है।) इस बिंदु पर, टेक्स्ट अभी तक नियंत्रण में प्रदर्शित नहीं होता है।

TextInput ईवेंट ऑब्जेक्ट कोड प्रदान करता है TextCompositionEventArgs. इस ऑब्जेक्ट में एक टेक्स्ट प्रॉपर्टी है जो रेंडर किए गए टेक्स्ट को कंट्रोल में पास करने के लिए तैयार करती है।

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

दुर्भाग्य से, PreviewKeyDown ईवेंट हैंडलर में मजबूत डेटा सत्यापन तर्क को लागू करना मुश्किल है, जैसा कि केवल कुंजी मान उपलब्ध है, और यह बहुत निम्न-स्तरीय जानकारी है। उदाहरण के लिए, कुंजी एन्यूमरेशन संख्यात्मक कीपैड (केवल संख्याओं को दर्ज करने के लिए एक ब्लॉक) और एक नियमित कीबोर्ड पर कुंजियों के बीच अंतर करता है। इसका मतलब यह है कि जहां 9 कुंजी दबाई जाती है, उसके आधार पर आपको Key.D9 या Key.NumPad9 मिलेगा। सभी मान्य मानों की जाँच करना कम से कम बहुत कठिन है।

कक्षा का उपयोग करने का एक तरीका है कुंजी कनवर्टर, जो आपको कुंजी मान को अधिक उपयोगी स्ट्रिंग में बदलने की अनुमति देता है। उदाहरण के लिए, एक फ़ंक्शन कॉल KeyConverter.ConvertToString () Key.D9 और Key.NumPad9 मानों में से किसी के साथ, स्ट्रिंग परिणाम "9" लौटाता है। Key.ToString() रूपांतरण को कॉल करने से एक कम उपयोगी एनम नाम उत्पन्न होता है (या तो "D9" या "NumPad9"):

KeyConverter कनवर्टर = नया KeyConverter (); स्ट्रिंग कुंजी = कनवर्टर। कन्वर्ट टॉस्ट्रिंग (ई.के);

हालाँकि, KeyConverter का उपयोग करना भी बहुत सुविधाजनक नहीं है, क्योंकि आपको उन कीस्ट्रोक्स के लिए लंबी लाइनों (उदाहरण के लिए, "बैकस्पेस") को संभालना होता है, जिसके परिणामस्वरूप टेक्स्ट इनपुट नहीं होता है।

सबसे उपयुक्त विकल्प PreviewTextInput ईवेंट (जहां अधिकांश सत्यापन किया जाता है) को PreviewKeyDown ईवेंट के साथ कुंजी प्रेस के लिए संभालना है जो टेक्स्ट फ़ील्ड (जैसे स्पेस बार) पर PreviewTextInput ईवेंट उत्पन्न नहीं करता है।



परियोजना का समर्थन करें - लिंक साझा करें, धन्यवाद!
यह भी पढ़ें
मुर्गा लड़ाई खेल नियम मुर्गा लड़ाई खेल नियम मिनीक्राफ्ट के लिए मॉड 1.7 10 वॉच रेसिपी।  Minecraft में आइटम क्राफ्ट करने की रेसिपी।  Minecraft में हथियार मिनीक्राफ्ट के लिए मॉड 1.7 10 वॉच रेसिपी। Minecraft में आइटम क्राफ्ट करने की रेसिपी। Minecraft में हथियार शिलिंग और स्टर्लिंग - शब्दों की उत्पत्ति शिलिंग और स्टर्लिंग - शब्दों की उत्पत्ति