2009-08-28 21 views
10

Ich arbeite derzeit an einer WPF-Anwendung, wo ich eine TextBox haben möchte, die nur numerische Einträge darin haben kann. Ich weiß, dass ich den Inhalt davon validieren kann, wenn ich den Fokus verliere und den Inhalt davon verbiete, numerisch zu sein, aber in anderen Windows Form-Anwendungen blockieren wir jede Eingabe, außer dass Zahlen notiert werden. Außerdem verwenden wir diesen Code in einer separaten DLL, um ihn an vielen Stellen zu referenzieren.Validierung in Textfeld in WPF

Hier wird der Code im Jahr 2008 mit WPF nicht:

Public Shared Sub BloquerInt(ByRef e As System.Windows.Forms.KeyPressEventArgs, ByRef oTxt As Windows.Forms.TextBox, ByVal intlongueur As Integer) 
    Dim intLongueurSelect As Integer = oTxt.SelectionLength 
    Dim intPosCurseur As Integer = oTxt.SelectionStart 
    Dim strValeurTxtBox As String = oTxt.Text.Substring(0, intPosCurseur) & oTxt.Text.Substring(intPosCurseur + intLongueurSelect, oTxt.Text.Length - intPosCurseur - intLongueurSelect) 

    If IsNumeric(e.KeyChar) OrElse _ 
     Microsoft.VisualBasic.Asc(e.KeyChar) = System.Windows.Forms.Keys.Back Then 
     If Microsoft.VisualBasic.AscW(e.KeyChar) = System.Windows.Forms.Keys.Back Then 
      e.Handled = False 
     ElseIf strValeurTxtBox.Length < intlongueur Then 
      e.Handled = False 
     Else 
      e.Handled = True 

     End If 
    Else 
     e.Handled = True 
    End If 

Gibt es ein Äquivalent Weg in WPF? Es würde mir nichts ausmachen, wenn dies in einem Stil ist, aber ich bin neu in WPF, so dass Stil etwas unklar ist, was sie tun können oder nicht können.

Antwort

23

Sie können die Eingabe auf Zahlen beschränken, indem Sie eine angehängte Eigenschaft für die TextBox verwenden. Definieren Sie die angefügte Eigenschaft einmal (auch in einer separaten DLL) und verwenden Sie sie für eine beliebige TextBox. Hier ist die angefügten Eigenschaft:

using System; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Input; 

    /// <summary> 
    /// Class that provides the TextBox attached property 
    /// </summary> 
    public static class TextBoxService 
    { 
     /// <summary> 
     /// TextBox Attached Dependency Property 
     /// </summary> 
     public static readonly DependencyProperty IsNumericOnlyProperty = DependencyProperty.RegisterAttached(
     "IsNumericOnly", 
     typeof(bool), 
     typeof(TextBoxService), 
     new UIPropertyMetadata(false, OnIsNumericOnlyChanged)); 

     /// <summary> 
     /// Gets the IsNumericOnly property. This dependency property indicates the text box only allows numeric or not. 
     /// </summary> 
     /// <param name="d"><see cref="DependencyObject"/> to get the property from</param> 
     /// <returns>The value of the StatusBarContent property</returns> 
     public static bool GetIsNumericOnly(DependencyObject d) 
     { 
     return (bool)d.GetValue(IsNumericOnlyProperty); 
     } 

     /// <summary> 
     /// Sets the IsNumericOnly property. This dependency property indicates the text box only allows numeric or not. 
     /// </summary> 
     /// <param name="d"><see cref="DependencyObject"/> to set the property on</param> 
     /// <param name="value">value of the property</param> 
     public static void SetIsNumericOnly(DependencyObject d, bool value) 
     { 
     d.SetValue(IsNumericOnlyProperty, value); 
     } 

     /// <summary> 
     /// Handles changes to the IsNumericOnly property. 
     /// </summary> 
     /// <param name="d"><see cref="DependencyObject"/> that fired the event</param> 
     /// <param name="e">A <see cref="DependencyPropertyChangedEventArgs"/> that contains the event data.</param> 
     private static void OnIsNumericOnlyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
     bool isNumericOnly = (bool)e.NewValue; 

     TextBox textBox = (TextBox)d; 

     if (isNumericOnly) 
     { 
      textBox.PreviewTextInput += BlockNonDigitCharacters; 
      textBox.PreviewKeyDown += ReviewKeyDown; 
     } 
     else 
     { 
      textBox.PreviewTextInput -= BlockNonDigitCharacters; 
      textBox.PreviewKeyDown -= ReviewKeyDown; 
     } 
     } 

     /// <summary> 
     /// Disallows non-digit character. 
     /// </summary> 
     /// <param name="sender">The source of the event.</param> 
     /// <param name="e">An <see cref="TextCompositionEventArgs"/> that contains the event data.</param> 
     private static void BlockNonDigitCharacters(object sender, TextCompositionEventArgs e) 
     { 
     foreach (char ch in e.Text) 
     { 
      if (!Char.IsDigit(ch)) 
      { 
       e.Handled = true; 
      } 
     } 
     } 

     /// <summary> 
     /// Disallows a space key. 
     /// </summary> 
     /// <param name="sender">The source of the event.</param> 
     /// <param name="e">An <see cref="KeyEventArgs"/> that contains the event data.</param> 
     private static void ReviewKeyDown(object sender, KeyEventArgs e) 
     { 
     if (e.Key == Key.Space) 
     { 
      // Disallow the space key, which doesn't raise a PreviewTextInput event. 
      e.Handled = true; 
     } 
     } 
    } 

Hier ist, wie es zu benutzen („Kontrollen“ mit Ihrem eigenen Namensraum ersetzen):

<TextBox controls:TextBoxService.IsNumericOnly="True" /> 
+1

Ich werde das versuchen. Ich stelle mir vor, dass ich so etwas praktisch hinzufügen kann. Zum Beispiel, die maximale Länge des Textes im Inneren, das ist auch ein anderes Problem, das ich hatte. –

+0

Vergessen zu erwähnen, es ist die maximale Länge einer Gleitzahl (die maximale Anzahl der Dezimalstellen und die maximale Anzahl der Ganzzahl) –

+1

Ja, angefügte Eigenschaften sind sehr mächtig und erlaubt Ihnen, alle Arten von Verhaltensweisen hinzuzufügen. –

4

Sie eine Validierung setzen können in Ihren bei diesem Beispiel

<TextBox> 
     <TextBox.Text> 
       <Binding Path="CategoriaSeleccionada.ColorFondo" 
         UpdateSourceTrigger="PropertyChanged"> 
        <Binding.ValidationRules> 
          <utilities:RGBValidationRule /> 
        </Binding.ValidationRules> 
       </Binding> 
     </TextBox.Text> 
</TextBox> 

Blick Bindung (meines Programms), setzen Sie die Validierung innerhalb des wie diese Bindung. Mit Update können Sie ändern, wenn Sie (Fokus verloren, in jeder Änderung ...) aktualisiert werden Bindung

Nun, die Validierung eine Klasse ist, werde ich Ihnen ein Beispiel setzen:

class RGBValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     // Here you make your validation using the value object. 
     // If you want to check if the object is only numbers you can 
     // Use some built-in method 
     string blah = value.ToString(); 
     int num; 
     bool isNum = int.TryParse(blah, out num); 

     if (isNum) return new ValidationResult(true, null); 
     else return new ValidationResult(false, "It's no a number"); 
    } 
} 

Kurz , führen Sie den Job innerhalb dieser Methode aus und geben Sie ein neues ValidationResult zurück. Der erste Parameter ist ein bool, wahr, wenn die Validierung gut ist, false, wenn nicht. Der zweite Parameter ist nur eine Nachricht für Informationen.

Ich denke, dass dies die Grundlagen der Textfeldvalidierung ist.

Hoffe diese Hilfe.

EDIT: Sorry, ich weiß nicht, VB.NET aber ich denke, dass der C# -Code ist ziemlich einfach.

+0

Ich weiß, beide so ist es einfach für mich, es zu conver. Danke, ich werde es bald genug versuchen. –