Ограничение символов в TextBox

Я создаю форму в приложении C# WinRT, и я хотел бы ограничить символы в одном из компонентов TextBox только цифрами. (Это текстовое поле будет для пользователя, чтобы ввести год.)

Я искал некоторое время, но не смог понять это, не настроив прослушиватель событий на TextChanged событие, и, осмотрев text свойство при каждом нажатии клавиши. Есть ли способ, чтобы просто сказать, что пользователь может вводить только определенные символы в Текстовое поле?

6 ответов


самое простое, что может работать, это привязка к 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 управление.


попробуйте текстовое поле.InputScope свойство для InputScopeNameValue.Число, как указано в руководство и контрольный список для ввода текста в 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, чтобы указать символы и длину, если таковые имеются. например, если вы хотите ввести только пять номеров, вы устанавливаете для свойства mask значение "00000". Просто. Windows обрабатывает ограничение для вас.