我试图只允许在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;
}
}
答案 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)
您可以使用KeyDown
和KeyUp
事件。我在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" />
谢谢!