Текстовое поле содержит только буквы, цифры и пробел - PullRequest
3 голосов
/ 21 мая 2009

Как я могу убедиться, что пользователь может вводить только буквенно-цифровой и пробел в текстовом поле события KeyDown в WPF? Специальные символы не допускаются.

Ответы [ 4 ]

6 голосов
/ 26 мая 2009

Проверьте событие keydown текстового поля и сделайте как

            // If escape is presses, then close the window.
            if( Key.Escape == e.Key )
            {
                this.Close();
            }
            // Allow alphanumeric and space.
            if( e.Key >= Key.D0 && e.Key <= Key.D9 ||
                e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9 ||
                e.Key >= Key.A && e.Key <= Key.Z ||
                e.Key == Key.Space )
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }

            // If tab is presses, then the focus must go to the
            // next control.
            if( e.Key == Key.Tab )
            {
                e.Handled = false;
            }

Надеюсь, это поможет ......

2 голосов
/ 27 мая 2014

Вы также можете использовать событие PreviewTextInput текстового поля.

<TextBox Name="txtName" PreviewTextInput="txtName_PreviewTextInput"/>

И добавьте следующее в ваш код:

private void txtName_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        foreach (char c in e.Text)
        {
            if (!char.IsLetterOrDigit(c))
            {
                e.Handled = true;
                break;
            }
        }
    }
0 голосов
/ 03 декабря 2015

Не думаю, что это хорошая практика - использовать KeyDown. Недостатком является то, что вам придется обрабатывать клавиши Backspace, Delete и Tab.

Вместо того, чтобы: Handle PreviewTextInput

private void OnPreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        if (!IsMatch(e.Text)) e.Handled = true;
    }

    private bool IsMatch(string input)
    {
        return Regex.IsMatch(input, MyRegexString);
    }

тогда нужно позаботиться о PasteHandler: добавить следующую строку в конструктор.

DataObject.AddPastingHandler(TargetTextBoxName, PasteHandler);

   private void PasteHandler(object sender, DataObjectPastingEventArgs e)
        {
            if (!e.DataObject.GetDataPresent(typeof(string))) return;
            // Allow pasting only numeric
            var pasteText = e.DataObject.GetData(typeof(string)) as string;
            if (!IsMatch(pasteText))
            {
                e.CancelCommand(); 
            }
        }
0 голосов
/ 21 мая 2009

Обработчик событий KeyDown может быть не лучшим местом для этого, так как символ уже добавлен в TextBox. Вы можете ответить на событие PreviewKeyDown и предотвратить его продолжение, но это может иметь неизвестные последствия.

Одним из подходов было бы присоединить ValidationRule к TextBox. Хотя это не остановит пользователя при вводе символа, оно сообщит им, что ему не разрешено. Для этого вы производите от System.Windows.Controls.ValidationRule, чтобы получить что-то вроде этого:

public class MyValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        // Logic to determine if the TextBox contains a valid string goes here
        // Maybe a reg ex that only matches alphanumerics and spaces
        if(isValidText)
        {
            return ValidationResult.ValidResult;
        }
        else
        {
            return new ValidationResult(false, "You should only enter an alphanumeric character or space");
        }
    }
}

А затем используйте его в XAML следующим образом:

<TextBox>
    <TextBox.Text>
        <Binding Path="MyString"
                 UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <myns:MyValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

Каждый раз, когда пользователь вводит недопустимый символ, он получает сообщение об ошибке. Надеюсь, это пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...