我在C#WinRT應用程序中構建表單,並且想要將其中一個TextBox組件中的字符限制爲數字。 (此文本框將供用戶輸入一年。)限制文本框中的字符
我已經搜索了一段時間,但一直未能在TextChanged
事件中未設置事件偵聽器的情況下計算出此事件,檢查每個按鍵上的text
屬性。有沒有辦法簡單地說用戶只能在TextBox中輸入特定的字符?
我在C#WinRT應用程序中構建表單,並且想要將其中一個TextBox組件中的字符限制爲數字。 (此文本框將供用戶輸入一年。)限制文本框中的字符
我已經搜索了一段時間,但一直未能在TextChanged
事件中未設置事件偵聽器的情況下計算出此事件,檢查每個按鍵上的text
屬性。有沒有辦法簡單地說用戶只能在TextBox中輸入特定的字符?
能夠工作是根據您的規則綁定到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
控制觸摸優先的方式。
使用MaskedTextBox控件。僅限數字,只需使用Mask屬性指定字符和長度(如果有)。例如如果您只想輸入五個數字,則將mask屬性設置爲「00000」。就那麼簡單。 Windows爲您處理限制。
是否有一個用於WinRT的MaskedTextBox? – 2012-04-20 01:50:57
@RitchMelton我目前不知道。我想答案應該是肯定的。 – olatunjee 2012-04-20 01:56:32
當前文檔說不。 http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.aspx – 2012-04-20 02:02:02
有效年份
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
http://stackoverflow.com/editing-help#code – 2012-04-20 02:43:04
嘗試TextBox.InputScope屬性設置爲InputScopeNameValue.Number,在MSDN中Guidelines and checklist for text input提及。
這很酷,並且(種類)也存在於WPF中。不知道這個。謝謝! – 2012-04-20 08:10:53
+1整潔的功能 – 2012-04-20 09:53:22
這種有點作品,但不會做我正在努力完成的。它看起來像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
這似乎爲我工作:
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的文檔。
根據在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;
}
Shift-4,應該是美元符號,不會用此代碼過濾掉。 4鍵被看作並被接受爲數字。看到這樣的問題: http://stackoverflow.com/questions/13001215/detect-if-modifier-key-is-pressed-in-keyroutedeventargs-event其中示出用於檢測的移位,控制各種方法 等鑰匙。 – 2015-01-19 00:57:21
標記爲答案,因爲它大多解決了我遇到的問題。這將限制文本框只顯示數字。但是,自從我重新訪問了我的應用程序的這一部分,並用一個ComboBox替換了年份字段,完全避開了這個問題。 (我已經有了一個固定的年限範圍,所以我不知道爲什麼我沒有首先使用組合框。) – 2012-04-26 04:19:42