Проверка в текстовом поле в WPF

В настоящее время я работаю над приложением WPF, где я хотел бы иметьTextBox в котором могут быть только числовые записи. Я знаю, что могу проверить его содержимое, когда я потерял фокус, и заблокировать содержимое, чтобы оно не было числовым, но в других приложениях Windows Form мы используем для полной блокировки любого ввода, кроме числового, от записи. Кроме того, мы используем этот код в отдельной 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)

Вы можете поставить подтверждение в вашем обязательном порядке


         
              
                     
                           
                     
               
         

Посмотрите на этот пример (моей программы), вы помещаете валидацию в привязку следующим образом. С 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 # довольно прост.

 David Brunelle28 авг. 2009 г., 14:58
Я знаю и то и другоеМне легко это преобразовать. Спасибо, скоро попробую.
Решение Вопроса

Вы можете ограничить ввод только числами, используя прикрепленное свойство в TextBox. Определите присоединенное свойство один раз (даже в отдельной DLL) и используйте его в любом TextBox. Вот прикрепленное свойство:

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

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

      /// 
      /// Gets the IsNumericOnly property.  This dependency property indicates the text box only allows numeric or not.
      /// 
      ///  to get the property from
      /// The value of the StatusBarContent property
      public static bool GetIsNumericOnly(DependencyObject d)
      {
         return (bool)d.GetValue(IsNumericOnlyProperty);
      }

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

      /// 
      /// Handles changes to the IsNumericOnly property.
      /// 
      ///  that fired the event
      /// A  that contains the event data.
      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;
         }
      }

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

      /// 
      /// Disallows a space key.
      /// 
      /// The source of the event.
      /// An  that contains the event data.
      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;
         }
      }
   }

Вот как это использовать (заменить "контроль» с вашим собственным пространством имен): я


 briantyler16 июл. 2011 г., 10:49
+1 - очень приятно!
 Paw Baltzersen04 нояб. 2011 г., 10:29
Побочный узел: метод BlockNonDigitCharacters может быть оптимизирован для:if (e.Text.Any(ch => !Char.IsDigit(ch))) e.Handled = true;
 John Myczek31 авг. 2009 г., 20:17
Да, прикрепленные свойства очень мощные и позволяют добавлять все типы поведения.
 David Brunelle31 авг. 2009 г., 16:21
Забыл упомянуть, этоs максимальная длина числа с плавающей запятой (максимальное количество десятичных и максимальное число целых частей)
 ioWint28 июл. 2011 г., 23:44
+1 мои первые прикрепленные свойства закодированы как вы сказали! Спасибо!
 David Brunelle31 авг. 2009 г., 15:18
попробую это. Я представляю, что могу добавить что-нибудь подобное. Например, максимальная длина текста внутри, что также является еще одной проблемой, которая у меня была.
 Ivan Danilov28 февр. 2012 г., 19:31
Это решение является в лучшем случае неполным. Это неВставить текст из буфера обмена с помощью Ctrl + V или с помощью контекстного меню, перетаскивая текст мышью. Автор темыКод неисправен таким же образом, но это не таксделать этот код лучше. -1 пока не исправлено.

Ваш ответ на вопрос