2009-06-27 12 views
8

के साथ सहायता इस पर दस्तावेज़ बहुत कमजोर हैं। TextCompositionManager के माध्यम से उपयोग किए जाने वाले टेक्स्ट इनपुट पर नियंत्रण रखने और नियंत्रण करने के लिए कई घटनाएं हैं जिन्हें आप हुक कर सकते हैं। यदि आप स्नैग कार्ड स्वाइप डेटा जैसे कुछ करना चाहते हैं, तो यह वह जगह है जहां आप इसे करेंगे। TextInput, TextStart, और TextUpdate:WPF TextCompositionManager ईवेंट

कि चिंता का विषय पाठ इनपुट तीन ईवेंट नहीं है। प्रत्येक घटना के दो संस्करण हैं, जहां एक घटना सुरंग (खिड़की से नियंत्रण में नियंत्रण करने के लिए यात्रा कर रही है) और जब यह (केंद्रित यूआई तत्व से खिड़की तक यात्रा) 0:

टनेलिंग:

  • PreviewTextInputEvent
  • PreviewTextInputStartEvent
  • PreviewTextInputUpdateEvent

बुदबुदाती:

  • TextInputEvent
  • TextInputStartEvent
  • TextInputUpdateEvent

तो, निर्भर करता है, जहां तार्किक पेड़ आप TextCompositionManager में हुक में, आप इन पाठ ईवेंट संशोधित कर सकता घटना के फोकस पर पहुंचने से पहले, या बाद में उन्हें देखें। यह सब दस्तावेज़ों और उपयोग में बहुत सरल और स्पष्ट है।


टी एल; डॉ

मैं तीन घटनाओं की एक सभ्य परिभाषा नहीं मिल रहा। एक स्वीकार्य उत्तर न केवल तीन घटनाओं (TextInput, TextInputStart, और TextInputUpdate) को परिभाषित करेगा, बल्कि उनकी तुलना और तुलना करेगा। उत्तरों का कोई साझाकरण नहीं, कृपया अपने स्रोतों का संदर्भ लें और विकिपीडिया सीमा से बाहर है। आपके ग्रेड का 25% इस पर निर्भर करता है।

उत्तर

17

उनके बीच अंतर आप किस प्रकार के चरित्र टाइप कर रहे हैं इस पर निर्भर करते हैं।

  • स्टैंडर्ड कुंजी: 'एक', 'ए', जैसे मुद्रण योग्य पात्रों '5', '%', बैकस्पेस, और इतने पर।
  • नियंत्रण कुंजी: Ctrl + C, Ctrl + H, Ctrl + M, आदि
  • दशमलव कुंजी कोड: बातें Alt + numpad 2 5 5 (आईबीएम के लिए बढ़ा दिया-ASCII कोड 255 है, जो की तरह यूनिकोड नॉनब्रेकिंग स्पेस यू +00 ए0) और Alt + numpad 0 2 5 5 (विंडोज एएनएसआई कोड 255 के लिए, जो यूनिकोड यू +00 एफएफ है)। यदि आपके पास Registry setting to enable it है तो शायद Alt + numpad प्लस 2 6 3 बी (यू +263 बी के लिए) पर भी लागू होगा; मैंने इसकी पुष्टि नहीं की है। (मैंने रजिस्ट्री सेटिंग सेट की है लेकिन इसका कोई तत्काल प्रभाव नहीं पड़ा; शायद रीबूट की आवश्यकता है।)
  • मृत कुंजी: मैं समझता हूं कि बहुभाषी कीबोर्ड में "मृत कुंजी" नामक अतिरिक्त चीजें हैं जो निम्न कीस्ट्रोक को संशोधित करती हैं। उदा।, आप "उमलॉट" मृत कुंजी दबा सकते हैं, उसके बाद 'ओ', जो ö (ओ उमॉट के साथ) "टाइप" करेगा। (मेरे पास विवरण गलत हो सकता है। मैंने हमेशा एक एन-यूएस कीबोर्ड का उपयोग किया है और मुझे नहीं पता कि मृत कुंजी का उपयोग करने में क्या होता है।) मुझे संदेह है कि ये दशमलव कुंजी कोड के समान व्यवहार करेंगे; निचे देखो।
  • आईएमई: विचारधारा भाषाएं "इनपुट विधि संपादक" नामक कुछ का उपयोग करती हैं। मैं मृत कुंजी के बारे में इनके बारे में भी कम जानता हूं, और मुझे नहीं पता कि वे इन घटनाओं को आग लगाना चाहते हैं या नहीं।

ध्यान दें कि शिफ्ट और Ctrl जैसे संशोधक कुंजी इन घटनाओं को सीधे नहीं फेंकते हैं (KeyDown के विपरीत जहां आप Shift दबाए जाते हैं, फिर 5 दबाए जाते हैं, आदि)। उदाहरण के लिए, "%" प्राप्त करने के लिए Shift + 5, केवल "%" स्ट्रिंग प्राप्त करने के साथ ईवेंट के एक अनुक्रम उत्पन्न करता है (यानी, एक टेक्स्ट इनपुट स्टार्ट और एक टेक्स्ट इनपुट)।


TextInputStart निकाल दिया जाता है जब भी आप एक चरित्र या चरित्र कोड लिखना शुरू करें। जब आप एक मानक कुंजी, एक नियंत्रण कुंजी, या दशमलव कुंजी कोड के पहले अंक दबाते हैं तो इसे निकाल दिया जाता है। जब इसे निकाल दिया जाता है, तो सिस्टम कभी-कभी, लेकिन हमेशा नहीं, पहले से ही जानता है कि आप किस कुंजी को दबा रहे हैं (मानक कुंजी और नियंत्रण कुंजी के मामले में)। यदि यह जानता है, तो यह आपको TextCompositionEventArgs में बताएगा; यदि यह नहीं जानता है, तो TextCompositionEventArgs खाली है और आपको कुछ भी नहीं बताता है।

TextInputUpdate निकाल दिया जाता है जब आप दशमलव कुंजी कोड के दूसरे और बाद के अंक दर्ज करते हैं। इस घटना के लिए मुझे अभी तक कुछ भी खाली टेक्स्टकंपोशनइवेंट आर्ट्स नहीं दिख रहा है (हालांकि यह संभव है कि मृत कुंजी या आईएमई के साथ परिवर्तन हो)।

टेक्स्ट इनपुट जब आप कुंजी दर्ज करते हैं तो निकाल दिया जाता है, और सिस्टम निश्चित रूप से जानता है कि आपने कौन सी कुंजी दर्ज की है, इसलिए यह हमेशा टेक्स्टकंपोशनइवेंट आर्ट्स में उपयोगी जानकारी है। इस घटना का मतलब है कि चरित्र वास्तव में "टाइप किया गया" है (यानी यह तब होता है जब आप टेक्स्टबॉक्स में टाइप करते समय चरित्र दिखाएंगे)।


तो यहाँ है कि कैसे घटनाओं के दृश्यों पात्रों के विभिन्न प्रकार के लिए काम करते हैं:

स्टैंडर्ड कुंजी: जैसे ही आप कुंजी दबाते हैं, आप एक TextInputStart तुरंत एक TextInput के बाद मिलता है। दोनों में उनके टेक्स्टकंपोशनइवेंट आर्ट्स में एक ही सामग्री है: e.Text और e.TextComposition.Text दोनों दबाए गए कुंजी पर सेट हैं। (ध्यान दें कि यह हमेशा एक प्रिंट करने योग्य चरित्र नहीं होता है। यदि आप बैकस्पेस दबाते हैं, तो यह e.Text में है।) यदि कुंजी दबाई जाती है, तो आपको प्रत्येक कुंजी-दोहराने के लिए ईवेंट (टेक्स्ट इनपुटपुट/टेक्स्ट इनपुट) की जोड़ी मिलती है।

नियंत्रण कुंजी: जैसे ही आप पत्र कुंजी दबाते हैं, आपको तुरंत टेक्स्ट इनपुट के बाद टेक्स्ट इनपुटपुट प्राप्त होता है। दोनों में उनके टेक्स्टकंपोशनइवेंट आर्ट्स में एक ही सामग्री है: e.ControlText और e.TextComposition.ControlText दोनों आपके द्वारा दबाए गए नियंत्रण कुंजी पर सेट हैं। यदि पत्र कुंजी दबाई जाती है, तो आपको प्रत्येक कुंजी-दोहराने के लिए ईवेंट (टेक्स्ट इनपुटपुट/टेक्स्ट इनपुट) की जोड़ी मिलती है।

दशमलव कुंजी कोड: मान लीजिए कि आप जैसे ही आप numpad 0 Alt + numpad 0 2 5 5. द्वारा लिखी जा रही हैं, तो आप एक TextInputStart घटना है, जो आप पूरी तरह से उपयोगी कुछ भी नहीं बताता है मिलता है।प्रत्येक कीस्ट्रोक numpad 2, numpad 5, और numpad 5 के लिए, आपको एक TextInputUpdate ईवेंट मिलता है, फिर से कोई उपयोगी जानकारी नहीं है (आप यह नहीं बता सकते कि अब तक कौन से अंक दबाए गए हैं)। जब आप Alt कुंजी को रिलीज़ करते हैं (जो वास्तव में आपके द्वारा दर्ज किया गया कुंजी "कुंजी" टाइप करता है), तो आपको eText और e.TextComposition.Text गुणों में दर्ज की गई कुंजी के साथ टेक्स्ट इनपुट ईवेंट मिलता है। (यह एक गैर-मुद्रित चरित्र हो सकता है, उदाहरण के लिए यदि आपने Alt + numpad 0 दर्ज किया है 8.) दशमलव कुंजी कोड के लिए कुंजी-दोहराना संभव नहीं है।

मृत कुंजी: जैसा कि मैंने ऊपर बताया है, मुझे नहीं पता कि इसका परीक्षण कैसे किया जाए। अगर किसी के पास जवाब है, तो मुझे बताएं, और मैं इसे यहां शामिल करूंगा।

आईएमई: फिर से, मुझे यह नहीं पता कि इसका परीक्षण कैसे किया जाए।


मेरे धारणा है कि, सबसे उपयोगों के लिए, TextInput इन घटनाओं है कि यह समझ में आता है (के बाद से अन्य दो हमेशा आप कुछ भी नहीं बताया) का उपयोग करने का केवल एक ही है। यही कारण है कि यह तीनों में से एकमात्र ऐसा क्यों है जिसे UIElement, UIElement3D, और ContentElement पर मानक रूटेड (गैर-संलग्न) ईवेंट के रूप में फिर से उजागर किया गया है।

+0

वाह, यह एक शानदार जवाब है। आप स्नातक सुमा सह लाउड। मैं आपके उत्तर को संतोषजनक के रूप में चिह्नित कर रहा हूं, लेकिन कृपया निम्नलिखित संबंधित प्रश्नों की समीक्षा करें जिन पर आप मेरी सहायता कर सकते हैं: http://stackoverflow.com/questions/1053533/how-can-i-prevent-input-controls-from- stealing-the-space-character-from-the-textc – Will

+0

मैंने मृत कुंजी के लिए पूर्वावलोकन ईवेंट का प्रयास किया है। जब मैं '~' दबाता हूं, तो मुझे 'TextTextInputStart' ईवेंट 'टेक्स्ट = ~' के साथ मिलता है। फिर, जब मैं 'ए' दबाता हूं, तो मुझे 'previewTextInputUpdate' मिलता है जिसके बाद 'TextTextInput'' टेक्स्ट = ã' के साथ मिलता है। 'टेक्स्ट इनपुट' घटनाओं के लिए, मुझे एक समान परिणाम मिलता है लेकिन 'टेक्स्ट इनपुट' ईवेंट कभी नहीं कहा जाता है। असल में, मुझे सरल कुंजी (जैसे 'ए') – luiscubal

+0

के लिए भी' टेक्स्ट इनपुट 'ईवेंट कभी नहीं मिलता है, यह कम से कम टेक्स्टबॉक्स के लिए होता है। इवेंट्स और संबंधित 'टेक्स्ट' गुणों का क्रम यहां दिया गया है: https://gist.github.com/luiscubal/9691303 – luiscubal

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