2012-04-20 114 views
6

我在C#WinRT應用程序中構建表單,並且想要將其中一個TextBox組件中的字符限制爲數字。 (此文本框將供用戶輸入一年。)限制文本框中的字符

我已經搜索了一段時間,但一直未能在TextChanged事件中未設置事件偵聽器的情況下計算出此事件,檢查每個按鍵上的text屬性。有沒有辦法簡單地說用戶只能在TextBox中輸入特定的字符?

回答

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; 
    } 

不過,我會迴避這種方式離開,因爲地鐵的口頭禪是觸摸,第一UI,你可以很容易做到這一點與FlipView控制觸摸優先的方式。

+0

標記爲答案,因爲它大多解決了我遇到的問題。這將限制文本框只顯示數字。但是,自從我重新訪問了我的應用程序的這一部分,並用一個ComboBox替換了年份字段,完全避開了這個問題。 (我已經有了一個固定的年限範圍,所以我不知道爲什麼我沒有首先使用組合框。) – 2012-04-26 04:19:42

-2

使用MaskedTextBox控件。僅限數字,只需使用Mask屬性指定字符和長度(如果有)。例如如果您只想輸入五個數字,則將mask屬性設置爲「00000」。就那麼簡單。 Windows爲您處理限制。

+1

是否有一個用於WinRT的MaskedTextBox? – 2012-04-20 01:50:57

+0

@RitchMelton我目前不知道。我想答案應該是肯定的。 – olatunjee 2012-04-20 01:56:32

+0

當前文檔說不。 http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.aspx – 2012-04-20 02:02:02

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 – 2012-04-20 02:43:04

6

嘗試TextBox.InputScope屬性設置爲InputScopeNameValue.Number,在MSDN中Guidelines and checklist for text input提及。

+0

這很酷,並且(種類)也存在於WPF中。不知道這個。謝謝! – 2012-04-20 08:10:53

+0

+1整潔的功能 – 2012-04-20 09:53:22

+1

這種有點作品,但不會做我正在努力完成的。它看起來像InputScope屬性更像是系統提示系統應該顯示哪個軟鍵盤,但它不會創建一個屏蔽的文本框來限制輸入。 (最後在MSDN論壇中發現了這個主題 - 下面的鏈接,請參閱Chipalo Street發佈的帖子,從2012年3月22日星期四下午5:49)。 http://social.msdn.microsoft。com /論壇/ en-US/winappswithcsharp /線程/ d746d7d7-91c7-4429-8efa-a748b4ce6a03 – 2012-04-23 14:14:39

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其中示出用於檢測的移位,控制各種方法 等鑰匙。 – 2015-01-19 00:57:21