我正在 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;
}
但是,我会回避这种方法,因为 Metro 的口号是触摸优先 UI,您可以使用控件以触摸优先的方式轻松完成FlipView
。
尝试将TextBox.InputScope属性设置为 InputScopeNameValue.Number,如MSDN中的文本输入指南和清单中所述。
有效年份
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
这似乎对我有用:
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 枚举的文档。
基于链接上的帖子,添加选项卡以允许导航。
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;
}
使用 MaskedTextBox 控件。仅对于数字,只需使用 Mask 属性来指定字符和长度(如果有)。例如,如果您只想输入五个数字,则将掩码属性设置为“00000”。就那么简单。Windows 会为您处理限制。