在WPF中的文本框中进行验证

Dav*_*lle 10 validation wpf textbox numeric

我目前正在开发一个WPF应用程序,我想拥有一个TextBox只能包含数字条目的应用程序.我知道当我丢失焦点并阻止内容为数字时我可以验证它的内容,但在其他Windows窗体应用程序中,我们使用完全阻止除了数字之外的任何输入被写下来.另外,我们使用这个代码放在一个单独的dll中,以便在很多地方引用它.

以下是2008年不使用WPF的代码:

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
Run Code Online (Sandbox Code Playgroud)

在WPF中有相同的方法吗?我不介意这是一个风格,但我是WPF的新手,所以风格有点模糊他们能做什么或不能做什么.

Joh*_*zek 23

您只能使用TextBox上的附加属性将输入限制为数字.定义附加属性一次(即使在单独的dll中)并在任何TextBox上使用它.这是附属物:

   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;
         }
      }
   }
Run Code Online (Sandbox Code Playgroud)

以下是如何使用它(将"controls"替换为您自己的命名空间):

<TextBox controls:TextBoxService.IsNumericOnly="True" />
Run Code Online (Sandbox Code Playgroud)