限制TextBox中的字符

时间:2012-04-20 01:43:01

标签: c# windows-8 microsoft-metro windows-runtime

我正在使用C#WinRT应用程序构建表单,我想将其中一个TextBox组件中的字符限制为仅数字。 (此TextBox将供用户输入一年。)

我已经搜索了一段时间,但是如果没有在TextChanged事件上设置事件监听器,并且在每次按键检查text属性时都无法解决这个问题。有没有办法简单地说用户只能在TextBox中输入特定的字符?

6 个答案:

答案 0 :(得分: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;
    }

然而,由于Metro的口号是触摸第一个UI ,我会回避这种方法,你可以通过FlipView控件以第一种方式轻松完成。< / p>

答案 1 :(得分:6)

尝试将TextBox.InputScope属性设置为InputScopeNameValue.Number,如MSDN中Guidelines and checklist for text input中所述。

答案 2 :(得分: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

答案 3 :(得分: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的文档。

答案 4 :(得分: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;
    }

答案 5 :(得分:-2)

使用MaskedTextBox控件。仅限数字,只需使用Mask属性指定字符和长度(如果有)。例如如果只想输入五个数字,则将mask属性设置为“00000”。就那么简单。 Windows为您处理限制。