Текстовое поле Silverlight для приема только десятичных дробей - PullRequest
0 голосов
/ 28 января 2012

У меня есть приложение Silverlight с текстовым полем, ввод которого я хочу ограничить только десятичными числами. При поиске в Интернете я наткнулся на следующее возможное решение (любопытно, что в разных местах разные люди утверждают, что они являются авторами одних и тех же строк кода) Кажется, он работает хорошо, за исключением того, что после ввода хотя бы 1 цифры он позволяет вводить букву «d» в верхнем или нижнем регистре, я не могу понять, почему это так, и, следовательно, не могу понять, как предотвратить это. Может кто-нибудь, пожалуйста, предоставьте решение. Большое спасибо.

    private void Unit_KeyDown(object sender, KeyEventArgs e)
    {

        if (e.Key == Key.Tab)
        {

        }
        var thisKeyStr = "";
        if (e.PlatformKeyCode == 190 || e.PlatformKeyCode == 110)
        {
            thisKeyStr = ".";
        }
        else
        {
            thisKeyStr = e.Key.ToString().Replace("D", "").Replace("NumPad", "");
        }
        var s = (sender as TextBox).Text + thisKeyStr;
        var rStr = "^[0-9]+[.]?[0-9]*$";
        var r = new Regex(rStr, RegexOptions.IgnoreCase);
        e.Handled = !r.IsMatch(s);

    }

Ответы [ 3 ]

2 голосов
/ 08 августа 2012

здесь проще оптимизировать код.НЕТ создания объекта;НЕТ сравнения строк и НЕТ проверки регулярных выражений

private static void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
        //platform code for Hyphen which is not same as Subtract symbol but in our case both give same meaning
        const int KEYCODE_Hyphen_OnKeyboard = 189;
        const int KEYCODE_Dot_OnKeyboard = 190;
        const int KEYCODE_Dot_OnNumericKeyPad = 110;

        e.Handled = !(
            (!( //No modifier key must be pressed
                 (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
              || (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control
              || (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt
            )
          && ( //only these keys are supported
                (e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9)
              || e.Key == Key.Subtract || e.Key == Key.Add || e.Key == Key.Decimal
              || e.Key == Key.Home || e.Key == Key.End || e.Key == Key.Delete
              || e.Key == Key.Tab || e.Key == Key.Enter || e.Key == Key.Escape || e.Key == Key.Back
              || (e.Key == Key.Unknown && (
                         e.PlatformKeyCode == KEYCODE_Hyphen_OnKeyboard
                      || e.PlatformKeyCode == KEYCODE_Dot_OnKeyboard || e.PlatformKeyCode == KEYCODE_Dot_OnNumericKeyPad
                    )
                 )
             )
          )
        );
    }
2 голосов
/ 28 января 2012

Можно попробовать следующее:

  1. Заменить else на else if (e.Key != Key.D) или
  2. установить свойство Handled следующим образом:

    e.Handled = !r.IsMatch(s) || string.IsNullOrEmpty(thisKeyStr);
    
    // also possible:
    e.Handled = !r.IsMatch(s) || e.Key == Key.D;
    
0 голосов
/ 11 декабря 2013
      private void TextBox_KeyDown(object sender, KeyEventArgs e)
    {
        bool isDigit = e.Key >= Key.D0 && e.Key < Key.D9 || e.Key == Key.NumPad0 || e.Key == Key.NumPad1 || e.Key == Key.NumPad2 || e.Key == Key.NumPad3 || e.Key == Key.NumPad4 || e.Key == Key.NumPad5 || e.Key == Key.NumPad6 ||
        e.Key == Key.NumPad7 || e.Key == Key.NumPad8 || e.Key == Key.NumPad9 ||e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Left || e.Key == Key.Right;

        if (isDigit) { }
        else
            e.Handled = true; 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...