2013-05-07 4 views
1

J'ai une zone de saisie qui ne doit autoriser que les nombres/devises. Pour ce faire, j'utilise le InputScope "CurrencyAmount".Comment restreindre les entrées du clavier numérique pour autoriser uniquement les points décimaux simples

Quand je lance le code d'un clavier numérique s'affiche, mais l'utilisateur est autorisé à entrer beaucoup point décimal au lieu de simplement un. Exemple: Des entrées comme "12.50" doivent être autorisées dans la zone de texte, mais l'utilisateur peut entrer des valeurs comme "12 .... 50", "..12.5 .... 0", etc. .

Comment puis-je restreindre les valeurs de zone de texte autorisées pour correspondre à mon critère?

+0

Valider l'entrée? – vcsjones

Répondre

2

Je voudrais ajouter un gestionnaire d'événement de clé vers le bas à votre zone de texte et valider si votre entrée correspond à votre prédicat.

pseudocode:

//... 
//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

Je suis un débutant en C#. Pourriez-vous expliquer où inscrire le gestionnaire d'événements? Dos-il aller dans la méthode void Initialize() publique? Merci, Matthew. –

+0

Je le mettrais dans le constructeur de votre page – MUG4N

2

vous pouvez inscrire à l'événement TextChanged pour TextBox et exécuter ci-dessous la validation - fonctionne bien pour d'autres endroits trop en dehors de les États-Unis.

string decimalsep = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator; 
int decimalSepCount = text1.Text.Count(f => f == decimalsep[0]); 
if (decimalSepCount > 1) 
{ 
    MessageBox.Show("Invalid input"); 
} 
+0

Cela fonctionne parfaitement pour valider mon entrée mais je voulais aussi dire comment bloquer physiquement l'utilisateur de taper quelques décimales dans ma boîte de texte GUI. Je suis débutant en C#, je comprends parfaitement votre code sauf (f => f == decimalsep [0]). Cela vous dérangerait-il d'expliquer? Merci, Matthew. –

+0

Dans Windows Phone, vous ne pouvez pas contrôler le comportement de la saisie au clavier sauf en choisissant la disposition du clavier (comme les chiffres, le texte, le courrier, l'URL, etc.) - non pris en charge pour le moment. Pour l'autre question, il s'agit simplement de compter le caractère séparateur décimal dans la zone de texte (en utilisant Linq). – Mahender

+0

J'ai vu des applications qui permettent à l'utilisateur d'entrer seulement un point décimal. Comment ont-ils mis en œuvre cela? –

3

Je voudrais aller avec un comportement et une regex. Ensuite, vous pouvez facilement réutiliser votre code pour d'autres zones de texte.

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

Ensuite, dans votre XAML, écrivez quelque chose comme.

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

Dans votre ViewModel vous spécifiez un Regex, par exemple

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