вы можете прослушать событие PreviewTextInput вместо KeyDownEvent:
myTextBox.PreviewTextInput += PreviewTextInputHandler;
, а затем:
private void PreviewTextInputHandler(Object sender, System.Windows.Input.TextCompositionEventArgs e)
{
e.Handled = !AreAllValidChars(e.Text);
}
это одна из таких функций, которую я использую в своем приложении, вы могли бы иметьнемного подправить его для проверки правильных символов, но вы знаете, как это сделать.
что касается получения символа%, то вам просто нужно написать что-то вроде:
if (e.Text == '%') ...;