2012-01-28 88 views
0

我有一个Silverlight应用程序,其文本框的输入仅限于十进制数。在网络上搜索我遇到了以下可能的解决方案(好奇地在不同的地方,不同的人声称作者是同一行代码) 它似乎工作得很好,除非至少输入一个数字后,它才会允许字母' d'无论是大写还是小写都可以输入,但我无法弄清楚这是为什么,因此无法弄清楚如何防止这种情况发生。任何人都可以请提供解决方案。非常感谢。Silverlight文本框只接受小数点

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

    } 

回答

2

你可以尝试以下方法:

  1. 更换elseelse 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

谢谢你提供的,你//也是可能的:是,似乎再工作最适合我,感谢解决方案。 – user995689 2012-01-28 12:36:29

2

这里是一个更容易代码优化。没有对象创建;没有字符串比较和NO的正则表达式验证

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 
        ) 
       ) 
      ) 
     ) 
     ); 
    } 
+0

这是一个很好的解决方案,但是,禁止修改器禁止用户使用键盘选择,复制,剪切或粘贴。 – 2013-10-30 15:31:43

0
 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; 
    } 
相关问题