2012-04-20 19 views
6

में वर्णों को प्रतिबंधित करना मैं एक सी # WinRT ऐप में एक फॉर्म बना रहा हूं, और मैं टेक्स्टबॉक्स घटक में वर्णों को केवल अंकों में प्रतिबंधित करना चाहता हूं। (इस टेक्स्ट बॉक्स एक उपयोगकर्ता में एक वर्ष में प्रवेश करने के लिए किया जाएगा।)टेक्स्टबॉक्स

मैं थोड़ी देर के लिए खोज की है, लेकिन नहीं TextChanged घटना पर एक घटना श्रोता की स्थापना के बिना इस एक बाहर निकालने में सफल रहे हैं, और प्रत्येक कुंजी प्रेस पर text संपत्ति का निरीक्षण करना। क्या यह कहने का कोई तरीका है कि कोई उपयोगकर्ता केवल टेक्स्टबॉक्स में विशिष्ट वर्ण दर्ज कर सकता है?

उत्तर

8

सरल बात कर सकता संभवतः काम अपने नियमों के अनुसार OnTextChanged घटना के लिए बाध्य और पाठ को संशोधित करने के लिए है कि।

<TextBox x:Name="TheText" TextChanged="OnTextChanged" MaxLength="4"/> 
private void OnTextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (TheText.Text.Length == 0) return; 

     var text = TheText.Text; 

     int result; 
     var isValid = int.TryParse(text, out result); 
     if (isValid) return; 

     TheText.Text = text.Remove(text.Length - 1); 
     TheText.SelectionStart = text.Length; 
    } 

हालांकि, मैं इस दृष्टिकोण से संकोच करता हूँ के बाद से मेट्रो का मंत्र स्पर्श पहले यूआई है और आप इसे एक FlipView नियंत्रण के साथ स्पर्श प्राथमिकता ढंग से आसान कर सकते हैं।

+0

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

-2

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

+1

क्या WinRT के लिए कोई मुखौटा टेक्स्टबॉक्स है? –

+0

@RitchMelton मैं वर्तमान में नहीं जानता। मुझे लगता है कि जवाब हाँ होना चाहिए। – olatunjee

+0

वर्तमान दस्तावेज़ कहते हैं नहीं। http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.aspx –

0

मान्य वर्ष

DateTime newDate; 
var validYear = DateTime.TryParseExact("2012", "yyyy", CultureInfo.InvariantCulture, 
DateTimeStyles.None, out newDate); //valid 

अमान्य वर्ष

var validYear = DateTime.TryParseExact("0000", "yyyy", CultureInfo.InvariantCulture, 
DateTimeStyles.None, out newDate); //invalid 
+0

http://stackoverflow.com/editing-help#code –

6

एमएसडीएन में Guidelines and checklist for text input में उल्लिखित TextBox.InputScope संपत्ति को इनपुटस्कोपनाम वैल्यू नम्बर पर सेट करने का प्रयास करें।

+0

यह अच्छा है, और (सॉर्ट-ऑफ) WPF में भी मौजूद है। इस बारे में नहीं पता था। धन्यवाद! –

+0

+1 एक साफ सुविधा के लिए –

+1

इस तरह का काम करता है, लेकिन मैं जो कुछ भी करने की कोशिश कर रहा हूं वह ठीक नहीं करेगा। ऐसा लगता है कि इनपुटस्कोप प्रॉपर्टी सिस्टम के संकेत के रूप में अधिक सेवा प्रदान करती है, क्योंकि सिस्टम को किस सॉफ्ट कीबोर्ड को प्रदर्शित करना चाहिए, लेकिन यह एक मुखौटा टेक्स्टबॉक्स नहीं बनाएगा जो इनपुट को सीमित करता है। (अंततः एमएसडीएन मंचों में यह धागा पाया - नीचे लिंक, चिप्लो स्ट्रीट से पोस्ट देखें, गुरुवार, 22 मार्च, 2012 5:49 अपराह्न)। http://social.msdn.microsoft।कॉम/मंच/एन-यूएस/winappswithcsharp/धागा/d746d7d7-91c7-4429-8efa-a748b4ce6a03 –

0

यह मेरे लिए काम करने के लिए लगता है:

private void TextBox_KeyDown(object sender, KeyRoutedEventArgs e) 
    { 
     if ((e.Key < VirtualKey.Number0) || (e.Key > VirtualKey.Number9)) 
     { 
      // If it's not a numeric character, prevent the TextBox from handling the keystroke 
      e.Handled = true; 
     } 
    } 

सभी मूल्यों के लिए VirtualKey enumeration के दस्तावेज़ देखें।

0

link पर एक पोस्टिंग के आधार पर, नेविगेशन को अनुमति देने के लिए टैब जोड़ना।

private void decimalTextBox_KeyDown(object sender, KeyRoutedEventArgs e) 
    { 
     bool isGoodData; // flag to make the flow clearer. 
     TextBox theTextBox = (TextBox)sender; // the sender is a textbox 

     if (e.Key>= Windows.System.VirtualKey.Number0 && e.Key <= Windows.System.VirtualKey.Number9) // allow digits 
      isGoodData = true; 
     else if (e.Key == Windows.System.VirtualKey.Tab) 
      isGoodData = true; 
     else if (e.Key >= Windows.System.VirtualKey.NumberPad0 && e.Key <= Windows.System.VirtualKey.NumberPad9) // allow digits 
      isGoodData = true; 
     else if (e.Key == Windows.System.VirtualKey.Decimal || (int)e.Key == 190) // character is a decimal point, 190 is the keyboard period code 
                        // which is not in the VirtualKey enumeration 
     { 
      if (theTextBox.Text.Contains(".")) // search for a current point 
       isGoodData = false; // only 1 decimal point allowed 
      else 
       isGoodData = true;  // this is the only one. 
     } 
     else if (e.Key == Windows.System.VirtualKey.Back) // allow backspace 
      isGoodData = true; 
     else 
      isGoodData = false; // everything else is bad 
     if (!isGoodData)   // mark bad data as handled 
      e.Handled = true; 
    } 
+1

Shift-4, जो एक डॉलर चिह्न होना चाहिए, इस कोड के साथ फ़िल्टर नहीं किया गया है। 4 कुंजी को एक अंक के रूप में देखा और स्वीकार किया जाता है। यह प्रश्न देखें: http://stackoverflow.com/questions/13001215/detect-if-modifier-key-is-pressed-in-keyroutedeventargs-event जहां शिफ्ट, नियंत्रण इत्यादि का पता लगाने के लिए विभिन्न विधियां दिखायी जाती हैं। ।, चांबियाँ। –

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