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

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

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


person Josh Buhler    schedule 20.04.2012    source источник


Ответы (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;
    }

Тем не менее, я бы избегал этого подхода, так как мантрой Metro является первый сенсорный интерфейс, и вы можете легко сделать это с помощью FlipView.

person Ritch Melton    schedule 20.04.2012
comment
Отметив это как ответ, поскольку он в основном решает проблему, с которой я столкнулся. Это ограничит TextBox отображением только чисел. Однако с тех пор я пересмотрел эту часть своего приложения и заменил поле года на ComboBox, чтобы полностью обойти проблему. (У меня есть фиксированный диапазон возможных лет, поэтому я не знаю, почему я вообще не использовал ComboBox.) - person Josh Buhler; 26.04.2012

Попробуйте установить TextBox .InputScope на InputScopeNameValue.Number, как указано в Рекомендации и контрольный список для ввода текста в MSDN.

person sdb    schedule 20.04.2012
comment
Это круто, и (вроде) существует и в WPF. Не знал об этом. Спасибо! - person Avner Shahar-Kashtan; 20.04.2012
comment
Это своего рода работает, но не будет делать именно то, что я пытаюсь выполнить. Похоже, что свойство InputScope больше служит подсказкой для системы о том, какую программную клавиатуру система должна отображать, но оно не создает замаскированное TextBox, ограничивающее ввод. (Наконец-то нашел эту ветку на форумах MSDN - ссылка ниже, см. Сообщение с улицы Чипало от четверга, 22 марта 2012 г., 17:49). social.msdn.microsoft. com/Forums/en-US/winappswithcsharp/thread/ - person Josh Buhler; 23.04.2012
comment
Ах, кажется, я неправильно понял документацию. Спасибо за указание на это. - person sdb; 24.04.2012

Год действия

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
person h3n    schedule 20.04.2012

Кажется, это работает для меня:

    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. для всех значений.

person Alex Vang    schedule 12.09.2012

На основании публикации на странице ссылка, добавление вкладки для навигации.

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;
    }
person Dave    schedule 02.10.2012
comment
Shift-4, который должен быть знаком доллара, в этом коде не отфильтровывается. Клавиша 4 воспринимается и принимается как цифра. См. этот вопрос: stackoverflow.com/questions/13001215/, где показаны различные методы обнаружения клавиш Shift, Control и т. д. - person David Rector; 19.01.2015

Используйте элемент управления MaskedTextBox. Только для цифр: просто используйте свойство Mask, чтобы указать символы и длину, если они есть. например если вы хотите ввести только пять цифр, вы устанавливаете свойство маски на «00000». Просто как тот. Windows обрабатывает ограничение за вас.

person olatunjee    schedule 20.04.2012
comment
Существует ли MaskedTextBox для WinRT? - person Ritch Melton; 20.04.2012
comment
@RitchMelton Сейчас я не знаю. Думаю, ответ должен быть да. - person olatunjee; 20.04.2012
comment
Текущие документы говорят, что нет. msdn.microsoft.com/en- мы/библиотека/окна/приложения/ - person Ritch Melton; 20.04.2012