如何在TextBox中仅注册数字?(我没有KeyPress事件)

时间:2019-05-02 08:46:52

标签: c# uwp uwp-xaml

我试图只允许在TextBox中注册数字,C#UWP XAML 而且我没有KeyPress Event我该怎么办?

与WinForms等效的是:

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

5 个答案:

答案 0 :(得分:1)

如果您以Windows 10 Fall Creators Update(v10.0.16299.0引入)为目标,则 您可以使用TextBoxBeforeTextChanging事件。 请参见以下示例。

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

您可以找到进一步的解释和示例here

答案 1 :(得分:0)

您可以使用KeyDownKeyUp事件。我在Windows 10 OS的UWP app上测试了此代码。工作正常。

<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:您需要更改此代码以支持带小数点和其他任何字符的数字(如果要支持)。

答案 2 :(得分:0)

如果您在UWP上拥有PreviewTextInput,也可以这样做:

<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));
}

如果“文本框”上的输入是数字btw 0和9,它将接受输入,否则输入将被丢弃。

如果要支持十进制数字或以.152开头,只需将正则表达式更改为:

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

答案 3 :(得分:0)

这是我在一个项目中使用的解决方案。

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>

可能并不完美,但是它对我们来说运作良好,我们需要支持周年更新,因此它应该对您有用。关于其他字符,请使用正则表达式并将其调整为所需的内容。祝你好运!

答案 4 :(得分:0)

希望,这段代码对您有所帮助。

使用此库

xmlns:extensions="using:Microsoft.Toolkit.Uwp.UI.Extensions"

以及在TextBox控件中

extensions:TextBoxRegex.ValidationMode="Dynamic"
extensions:TextBoxRegex.ValidationType="Number"

例如

 <TextBox x:Name="textboxName" Header="Testing"  extensions:TextBoxRegex.ValidationMode="Dynamic"  extensions:TextBoxRegex.ValidationType="Number" />

谢谢!