Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数字键盘输入限制为仅允许单个小数点_C#_Visual Studio 2012_Windows Phone 8 - Fatal编程技术网

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()方法?谢谢,马修。我会把它放到你页面的构造器中