代码之家  ›  专栏  ›  技术社区  ›  David Brunelle

WPF文本框中的验证

  •  10
  • David Brunelle  · 技术社区  · 15 年前

    我目前正在一个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
    

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

    2 回复  |  直到 13 年前
        1
  •  23
  •   John Myczek    15 年前

    只能使用文本框上的附加属性将输入限制为数字。定义一次附加属性(即使在单独的dll中),并在任何文本框中使用它。附属性如下:

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

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

    <TextBox controls:TextBoxService.IsNumericOnly="True" />
    
        2
  •  4
  •   Jesus Rodriguez    15 年前

    您可以在绑定中进行验证

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

    看看这个(我的程序)示例,您将验证放在绑定中,如下所示。使用UpdateSourceTrigger,您可以更改绑定何时更新(丢失焦点,每次更改中…)

    好吧,验证是一个类,我给你举个例子:

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

    简而言之,在该方法内执行该操作并返回一个新的validationresult。第一个参数是bool,如果验证良好,则为true,否则为false。第二个参数只是一条信息消息。

    我认为这是文本框验证的基础。

    希望这有帮助。

    编辑:对不起,我不知道vb.net,但我认为C代码非常简单。