2012-01-28 74 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; 
    } 
相關問題