2013-05-07 87 views
1

我有一个输入框应该只允许数字/货币。为此,我使用InputScope“CurrencyAmount”。如何限制数字键盘输入只允许单个小数点

当我运行的代码数字键盘就会弹出,但用户被允许进入许多小数点,而不是仅仅一个

例如: 应该允许在文本框中输入类似“12.50”的输入,但是用户可以输入像“12 .... 50”,“。12.5 .... 0”等值。

如何限制允许的文本框值符合我的标准?

+0

验证输入? – vcsjones 2013-05-07 20:56:39

回答

2

我会追加一个按键事件处理程序到您的文本框,并验证您的输入是否与您的谓词匹配。

伪代码:

//... 
//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; 
} 
+0

我是C#的初学者。你介意解释在哪里注册事件处理程序?它是否进入公共无效Initialize()方法?谢谢,马修。 – 2013-05-08 14:18:04

+0

我会将它放到页面的构造函数中 – MUG4N 2013-05-08 22:25:02

2

你可以尝试订阅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"); 
} 
+0

这可以完美地验证我的输入,但我也意味着如何物理阻止用户在我的GUI文本框中输入小数点。我是C#的初学者,除了(f => f == decimalsep [0])外,我完全理解你的代码。你介意解释吗?谢谢你,马修。 – 2013-05-08 14:13:02

+0

在Windows Phone中,除了选择键盘布局(如数字,文本,邮件,URL等)之外,您无法控制键盘输入的行为 - 目前不支持。在另一个问题上,它只是计算文本框中的小数点分隔符(使用Linq)。 – Mahender 2013-05-08 14:18:44

+0

我见过的应用程序只允许用户输入一个小数点。他们是如何实现这一点的? – 2013-05-08 14:55:08

3

我会去行为和正则表达式。然后,您可以轻松地将您的代码重新用于其他文本框。

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

然后在你的XAML中写下类似的东西。

<TextBox InputScope="Number" Text="{Binding Amount, Mode=TwoWay}"> 
    <i:Interaction.Behaviors> 
     <Control:RegexValidationBehavior RegexString="{Binding OnlyTwoDecimalsRegex}"/> 
    </i:Interaction.Behaviors> 
</TextBox> 

在您的视图模型您指定的正则表达式,例如

public string OnlyTwoDecimalsRegex { get { return @"^([0-9]+)?([,|\.])?([0-9]{1,2})?$"; } }