Разрешить только числовую запись в текстовом поле WPF - PullRequest
13 голосов
/ 03 ноября 2010

Я хотел бы проверить ввод пользователя, чтобы убедиться, что они целые числа.Как мне это сделать?Я думал об использовании IDataErrorInfo, который кажется «правильным» способом проверки в WPF.Поэтому я попытался реализовать его в моей ViewModel.

Но дело в том, что мое текстовое поле связано с целочисленным полем, и нет необходимости проверять, если int является int.Я заметил, что WPF автоматически добавляет красную рамку вокруг текстового поля, чтобы уведомить пользователя об ошибке.Базовое свойство не изменяется на недопустимое значение.Но я хотел бы уведомить пользователя об этом.Как я могу это сделать?

Ответы [ 4 ]

14 голосов
/ 03 ноября 2010

Другой способ - просто запретить значения, которые не являются целыми числами. Следующая реализация является немного отстойной, и я хотел бы абстрагироваться от нее позже, чтобы сделать ее более пригодной для повторного использования, но я сделал следующее:

в коде, на мой взгляд (я знаю, что это может быть больно, если вы хардкорный mvvm; o)) Я определил следующие функции:

  private void NumericOnly(System.Object sender, System.Windows.Input.TextCompositionEventArgs e)
{
    e.Handled = IsTextNumeric(e.Text);

}


private static bool IsTextNumeric(string str)
{
    System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("[^0-9]");
    return reg.IsMatch(str);

}

И в представлении XAML каждое текстовое поле, которое должно было принимать только целые числа был определен так:

   <TextBox Padding="2"  TextAlignment="Right" PreviewTextInput="NumericOnly" Text="{Binding xxx.yyyy}" MaxLength="1" />

Ключевым атрибутом является PreviewTextInput

12 голосов
/ 03 ноября 2010

Красная граница, которую вы видели, на самом деле представляет собой шаблон ValidationTemplate, который вы можете расширить и добавить информацию для пользователя. Смотрите этот пример:

    <UserControl.Resources>
        <ControlTemplate x:Key="validationTemplate">
            <Grid>
                <Label Foreground="Red" HorizontalAlignment="Right" VerticalAlignment="Center">Please insert a integer</Label>
                <Border BorderThickness="1" BorderBrush="Red">
                    <AdornedElementPlaceholder />
                </Border>
            </Grid>
        </ControlTemplate>
    </UserControl.Resources>

<TextBox Name="tbValue" Validation.ErrorTemplate="{StaticResource validationTemplate}">
8 голосов
/ 04 июня 2012

Мы можем сделать проверку измененного события в текстовом поле. Следующая реализация запрещает ввод данных нажатием клавиши, кроме цифр и одной десятичной точки.

private void textBoxNumeric_TextChanged(object sender, TextChangedEventArgs e)
{
        TextBox textBox = sender as TextBox;
        Int32 selectionStart = textBox.SelectionStart;
        Int32 selectionLength = textBox.SelectionLength;
        String newText = String.Empty;
        int count = 0;
        foreach (Char c in textBox.Text.ToCharArray())
        {
            if (Char.IsDigit(c) || Char.IsControl(c) || (c == '.' && count == 0))
            {
                newText += c;
                if (c == '.')
                    count += 1;
            }
        }
        textBox.Text = newText;
        textBox.SelectionStart = selectionStart <= textBox.Text.Length ? selectionStart : textBox.Text.Length;    
}
0 голосов
/ 29 марта 2018

, если вы работаете в WPF Better, чтобы использовать событие PreviewTextInput, которое поддерживает все платформы и из presentationcore.dll

вот пример:

private void TextBox_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
    {
        if ((e.Text) == null || !(e.Text).All(char.IsDigit))
        {
            e.Handled = true;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...