C# 如何将数字键盘输入限制为仅允许单个小数点
我有一个只允许数字/货币的输入框。为此,我使用C# 如何将数字键盘输入限制为仅允许单个小数点,c#,visual-studio-2012,windows-phone-8,C#,Visual Studio 2012,Windows Phone 8,我有一个只允许数字/货币的输入框。为此,我使用InputScope“CurrencyAmount” 当我运行代码时,会弹出一个数字键盘,但允许用户输入多个小数点,而不是一个小数点 例如: 文本框中应允许输入“12.50”,但用户可以输入“12…50”、“12.5…0”等值 如何限制允许的文本框值以匹配我的标准?我会在文本框中附加一个键关闭事件处理程序,并验证输入是否匹配谓词 伪代码: //... //register event handler yourTextBox.KeyDown += ne
InputScope
“CurrencyAmount”
当我运行代码时,会弹出一个数字键盘,但允许用户输入多个小数点,而不是一个小数点
例如:
文本框中应允许输入“12.50”,但用户可以输入“12…50”、“12.5…0”等值
如何限制允许的文本框值以匹配我的标准?我会在文本框中附加一个键关闭事件处理程序,并验证输入是否匹配谓词 伪代码:
//...
//register event handler
yourTextBox.KeyDown += new KeyEventHandler(yourTextBox_KeyDown);
//...
//the keydown event
public void yourTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (System.Text.RegularExpressions.Regex.IsMatch(yourTextBox.Text,"<enter a regular expression here>"))
e.Handled = true;
else e.Handled = false;
}
/。。。
//寄存器事件处理程序
yourTextBox.KeyDown+=新的KeyEventHandler(yourTextBox\u KeyDown);
//...
//按键事件
public void yourTextBox_KeyDown(对象发送者,KeyEventArgs e)
{
if(System.Text.RegularExpressions.Regex.IsMatch(yourTextBox.Text,“”)
e、 已处理=正确;
否则e.已处理=错误;
}
我会在文本框中附加一个键关闭事件处理程序,并验证输入是否与谓词匹配
伪代码:
//...
//register event handler
yourTextBox.KeyDown += new KeyEventHandler(yourTextBox_KeyDown);
//...
//the keydown event
public void yourTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (System.Text.RegularExpressions.Regex.IsMatch(yourTextBox.Text,"<enter a regular expression here>"))
e.Handled = true;
else e.Handled = false;
}
/。。。
//寄存器事件处理程序
yourTextBox.KeyDown+=新的KeyEventHandler(yourTextBox\u KeyDown);
//...
//按键事件
public void yourTextBox_KeyDown(对象发送者,KeyEventArgs e)
{
if(System.Text.RegularExpressions.Regex.IsMatch(yourTextBox.Text,“”)
e、 已处理=正确;
否则e.已处理=错误;
}
您可以尝试订阅textbox的TextChanged事件,并在验证下运行-适用于除美国以外的其他地区
string decimalsep = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
int decimalSepCount = text1.Text.Count(f => f == decimalsep[0]);
if (decimalSepCount > 1)
{
MessageBox.Show("Invalid input");
}
您可以尝试订阅textbox的TextChanged事件,并在验证下运行-对于除en US之外的其他地区也很有效
string decimalsep = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
int decimalSepCount = text1.Text.Count(f => f == decimalsep[0]);
if (decimalSepCount > 1)
{
MessageBox.Show("Invalid input");
}
我会用一种行为和正则表达式。然后,您也可以轻松地将代码用于其他文本框
public class RegexValidationBehavior : Behavior<TextBox>
{
public static readonly DependencyProperty RegexStringProperty =
DependencyProperty.Register("RegexString", typeof(string), typeof(RegexValidationBehavior), new PropertyMetadata(string.Empty));
public string RegexString
{
get { return GetValue(RegexStringProperty) as string; }
set { SetValue(RegexStringProperty, value); }
}
protected override void OnAttached()
{
base.OnAttached();
if (AssociatedObject != null)
{
AssociatedObject.TextChanged += OnTextChanged;
}
Validate();
}
protected override void OnDetaching()
{
base.OnDetaching();
if (AssociatedObject != null)
{
AssociatedObject.TextChanged -= OnTextChanged;
}
}
private void OnTextChanged(object sender, TextChangedEventArgs e)
{
Validate();
}
private void Validate()
{
var value = AssociatedObject.Text;
if (value.IsNotEmpty() && RegexString.IsNotEmpty())
{
MatchAgainstRegex(value);
}
}
private void MatchAgainstRegex(string value)
{
var match = Regex.Match(value, RegexString);
if (!match.Success)
{
AssociatedObject.Text = value.Remove(value.Length - 1);
AssociatedObject.Select(AssociatedObject.Text.Length, 0);
}
}
}
我会用一种行为和正则表达式。然后,您也可以轻松地将代码用于其他文本框
public class RegexValidationBehavior : Behavior<TextBox>
{
public static readonly DependencyProperty RegexStringProperty =
DependencyProperty.Register("RegexString", typeof(string), typeof(RegexValidationBehavior), new PropertyMetadata(string.Empty));
public string RegexString
{
get { return GetValue(RegexStringProperty) as string; }
set { SetValue(RegexStringProperty, value); }
}
protected override void OnAttached()
{
base.OnAttached();
if (AssociatedObject != null)
{
AssociatedObject.TextChanged += OnTextChanged;
}
Validate();
}
protected override void OnDetaching()
{
base.OnDetaching();
if (AssociatedObject != null)
{
AssociatedObject.TextChanged -= OnTextChanged;
}
}
private void OnTextChanged(object sender, TextChangedEventArgs e)
{
Validate();
}
private void Validate()
{
var value = AssociatedObject.Text;
if (value.IsNotEmpty() && RegexString.IsNotEmpty())
{
MatchAgainstRegex(value);
}
}
private void MatchAgainstRegex(string value)
{
var match = Regex.Match(value, RegexString);
if (!match.Success)
{
AssociatedObject.Text = value.Remove(value.Length - 1);
AssociatedObject.Select(AssociatedObject.Text.Length, 0);
}
}
}
这很好地验证了我的输入,但我的意思是如何在GUI文本框中实际阻止用户键入小数点。我是C#的初学者,我完全理解你的代码,除了(f=>f==decimalsep[0])。你能解释一下吗?谢谢你,Matthew。在Windows Phone中,除了选择键盘布局(如数字、文本、邮件、URL等)之外,你无法控制键盘输入的行为-目前不支持。在另一个问题上,它只是计算文本框中的小数分隔符字符(使用Linq)。我见过一些应用程序允许用户只输入一个小数点。他们是如何实现的?他们检查一个事件,例如,在文本框值中是否已经有小数点,如果已经有小数点,则不允许通过在事件中设置e.handle=false来使用另一个小数点。顺便说一句,f=>f==decimalsep[0]是一个lambda表达式,在这个示例中表示一个谓词。这个表达式可以很好地验证我的输入,但是我的意思是如何物理地阻止用户在我的GUI文本框中键入小数点。我是C#的初学者,我完全理解你的代码,除了(f=>f==decimalsep[0])。你能解释一下吗?谢谢你,Matthew。在Windows Phone中,除了选择键盘布局(如数字、文本、邮件、URL等)之外,你无法控制键盘输入的行为-目前不支持。在另一个问题上,它只是计算文本框中的小数分隔符字符(使用Linq)。我见过一些应用程序允许用户只输入一个小数点。他们是如何实现的?他们会检查一个事件,例如,在文本框值中是否已经有一个小数点,如果已经有,则在事件中通过设置e.handle=false不允许另一个小数点。顺便说一句,f=>f==decimalsep[0]是一个lambda表达式,表示此示例中的谓词。我是C#的初学者。您介意解释一下在哪里注册事件处理程序吗?它是否进入公共void Initialize()方法?谢谢,Matthew。我会把它放到你页面的构造函数中。我是C#的初学者。您介意解释一下在哪里注册事件处理程序吗?它是否进入公共void Initialize()方法?谢谢,马修。我会把它放到你页面的构造器中