Как я могу зарегистрировать только числа в TextBox? (У меня нет события KeyPress) - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь разрешить регистрировать только числа в TextBox, C # UWP XAML, и у меня нет события KeyPress, что мне делать?

Эквивалент WinForms того, что я хочу сделать, это:

private void txtbox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar)) 
    {
        e.Handled = true;
    }
}

Ответы [ 4 ]

1 голос
/ 02 мая 2019

Если вы нацелены на обновление Windows 10 Fall Creators (введено v10.0.16299.0), тогда вы можете использовать событие TextBoxBeforeTextChanging.Смотрите ниже пример.

private void TextBox_OnBeforeTextChanging(TextBox sender, TextBoxBeforeTextChangingEventArgs args)
    {
        args.Cancel = args.NewText.Any(c => !char.IsDigit(c));
    }

Вы можете найти дальнейшие объяснения и примеры здесь .

0 голосов
/ 03 мая 2019

Вот решение, которое я использую в одном из своих проектов.

class NumericOnlyTextBox : TextBox
{
    public NumericOnlyTextBox()
    {
        this.DefaultStyleKey = typeof(TextBox);
        TextChanging += NumericOnlyTextBox_TextChanging;
        Paste += NumericOnlyTextBox_Paste;
    }

    private void NumericOnlyTextBox_Paste(object sender, TextControlPasteEventArgs e)
    {
        //do not allow pasting (or code it yourself)
        e.Handled = true;
        return;
    }

    private void NumericOnlyTextBox_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
    {
        var matchDecimal = Regex.IsMatch(sender.Text, "^\\d*\\.?\\d*$");
        var matchInt = Regex.IsMatch(sender.Text, "^\\d*$");

        //default - does it match and int?
        bool passesTest = matchInt;

        //if not matching an int, does it match decimal if decimal is allowed
        if (!passesTest && AllowDecimal)
        {
            passesTest = matchDecimal;
        }

        //handle the cursor
        if (!passesTest && sender.Text != "")
        {
            int pos = sender.SelectionStart - 1;
            sender.Text = sender.Text.Remove(pos, 1);
            sender.SelectionStart = pos;
        }
    }

    protected override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        InputScope scope = new InputScope();
        InputScopeName scopeName = new InputScopeName();
        scopeName.NameValue = InputScopeNameValue.NumberFullWidth;
        scope.Names.Add(scopeName);
    }

    public bool AllowDecimal
    {
        get { return (bool)GetValue(AllowDecimalProperty); }
        set { SetValue(AllowDecimalProperty, value); }
    }

    // Using a DependencyProperty as the backing store for AllowDecimal.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty AllowDecimalProperty =
        DependencyProperty.Register("AllowDecimal", typeof(bool), typeof(NumericOnlyTextBox), new PropertyMetadata(false));


}

Тогда вы используете его так:

<StackPanel>
    <local:NumericOnlyTextBox Width="250" Margin="10" />
    <local:NumericOnlyTextBox AllowDecimal="True" Width="250" Margin="10" />
</StackPanel>

Возможно, не идеально, но оно хорошо работает длянам и нам нужно поддерживать Anniversary Update, поэтому оно должно работать на вас.Что касается других персонажей, поиграйте с регулярным выражением и настройте его на то, что вы ищете.Удачи!

0 голосов
/ 02 мая 2019

Если у вас есть PreviewTextInput на UWP, вы можете сделать это так же:

<TextBox PreviewTextInput="NumberValidation"/>

private void NumberValidation(object sender, TextCompositionEventArgs e)
{
    Regex regex = new Regex("^[0-9]*$");
    e.Handled = !regex.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart, e.Text));
}

Если для ввода в TextBox заданы числа от 0 до 9, он примет ввод, если нет - отменит его.

Если вы хотите поддержать десятичное число или начало с .152, просто измените регулярное выражение на следующее:

Regex regex = new Regex("^[.][0-9]+$|^[0-9]*[.]{0,1}[0-9]*$");

0 голосов
/ 02 мая 2019

Вы можете использовать KeyDown и KeyUp события. Я тестировал этот код в приложении UWP на ОС Windows 10. Работает нормально.

<TextBox InputScope="NumberFullWidth" KeyDown="TextBox_KeyDown"></TextBox>

InputScope откроет клавиатуру определенного устройства на сенсорном устройстве.

private void TextBox_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
{
    if (e.Key.ToString().Equals("Back"))
    {
        e.Handled = false;
        return;
    }
    for (int i = 0; i < 10; i++)
    {
        if (e.Key.ToString() == string.Format("Number{0}", i))
        {
            e.Handled = false;
            return;
        }
    }
    e.Handled = true;
}

PS: Вам необходимо изменить этот код для поддержки чисел с десятичными точками и любых других символов (если хотите поддерживать).

...