Konvertieren eines System.Windows.Input.KeyEventArgs Schlüssel zu einem char
-
21-08-2019 - |
Frage
Ich brauche die Veranstaltung args als char
zu bekommen, aber wenn ich den Schlüssel Enum versuchen Casting bekomme ich ganz andere Buchstaben und Symbole als das, was in übergeben wurde.
Wie konvertieren Sie richtig den Schlüssel zu einem char?
Das ist, was ich habe versucht,
ObserveKeyStroke(this, new ObervableKeyStrokeEvent((char)((KeyEventArgs)e.StagingItem.Input).Key));
Edit: Ich weiß nicht auch die KeyCode Eigenschaft auf den args haben. Ich bin sich aus dem InputManager.Current.PreNotifyInput Ereignisse zu bekommen.
Lösung
Siehe Wie ein Zeichen in einem gleichwertigen System.Windows.Input.Key Enum-Wert konvertieren?
Verwenden Sie KeyInterop.VirtualKeyFromKey
statt.
Andere Tipps
Es dauert ein wenig gewöhnungsbedürftig, aber man kann nur die Schlüsselwerte selbst nutzen. Wenn Sie versuchen, Eingang alphanumerics zu begrenzen und vielleicht ein wenig mehr, kann der Code unten helfen.
private bool bLeftShiftKey = false;
private bool bRightShiftKey = false;
private bool IsValidDescriptionKey(Key key)
{
//KEYS ALLOWED REGARDLESS OF SHIFT KEY
//various editing keys
if (
key == Key.Back ||
key == Key.Tab ||
key == Key.Up ||
key == Key.Down ||
key == Key.Left ||
key == Key.Right ||
key == Key.Delete ||
key == Key.Space ||
key == Key.Home ||
key == Key.End
) {
return true;
}
//letters
if (key >= Key.A && key <= Key.Z)
{
return true;
}
//numbers from keypad
if (key >= Key.NumPad0 && key <= Key.NumPad9)
{
return true;
}
//hyphen
if (key == Key.OemMinus)
{
return true;
}
//KEYS ALLOWED CONDITITIONALLY DEPENDING ON SHIFT KEY
if (!bLeftShiftKey && !bRightShiftKey)
{
//numbers from keyboard
if (key >= Key.D0 && key <= Key.D9)
{
return true;
}
}
return false;
}
private void cboDescription_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.LeftShift)
{
bLeftShiftKey = true;
}
if (e.Key == Key.RightShift)
{
bRightShiftKey = true;
}
if (!IsValidDescriptionKey(e.Key))
{
e.Handled = true;
}
}
private void cboDescription_PreviewKeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.LeftShift)
{
bLeftShiftKey = false;
}
if (e.Key == Key.RightShift)
{
bRightShiftKey = false;
}
}
Diese Arbeit für mich:
auf dem letzten Eintrag Basierend ich, dass es in WPF gefunden ist kein solches Ereignis PreNotifyInput
, aber ich fand und äquivalenter PreviewTextInput
Zuerst versuche ich mit einem RegExp
, aber ich kann es nicht funktioniert, dann verwende ich eine einfache indexOf
.
private bool ValidChar(string _char)
{
string Lista = @" ! "" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ";
return Lista.IndexOf(_char.ToUpper()) != -1;
//System.Text.RegularExpressions.Regex RegVal = new System.Text.RegularExpressions.Regex(@"(?<LETRAS>[A-Z]+)+(?<NUMERO>[0-9]+)+(?<CAR>[!|""|#|$|%|&|'|(|)|*|+|,|\-|.|/|:|;|<|=|>|?|@]+)+");
//return RegVal.IsMatch(_char);
}
private void textBoxDescripcion_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
if (!ValidChar(e.Text))
e.Handled = true;
}
Ich weiß, das ist alt, aber keine der Antworten scheint tatsächlich die Frage zu beantworten. Der Grund, ein anderes Zeichen wird wieder kommen, weil, wenn Sie nur versuchen, es zu einem char
werfen Sie den Enum-Wert auf einen ‚char‘ werfen. Allerdings:
var keyPressed = e.key.ToString();
Arbeiten groß. Gibt den Schlüssel als String gedrückt. Dann überprüfen Sie die Länge. Wenn es == 1, dann ist es ein Zeichen, eine Zahl oder Symbol. Wenn es größer als 1 ist, es ist eine spezielle Taste.
Wenn Sie nur die Zeichen möchten, können Sie dann keyPressed[0];
tun
Dies ist, wie ich es tun.
private void scrollViewer_KeyDown(object sender, KeyEventArgs e)
{
if (!e.IsRepeat)
{
var keyPressed = e.Key.ToString();
if(keyPressed.Length == 1)
CharKeyPressed(keyPressed[0]);
else if(keyPressed.Length > 1)
HandleSpecialKey(keyPressed)
}
}
In Ihrem PreNotifyInput Handler, versuchen, etwas wie folgt aus:
if (e.StagingItem.Input is System.Windows.Input.TextCompositionEventArgs)
{
if (!String.IsNullOrEmpty((e.StagingItem.Input as System.Windows.Input.TextCompositionEventArgs).Text))
{
Char c = (e.StagingItem.Input as System.Windows.Input.TextCompositionEventArgs).Text[0];
}
}
Es stellt mich mehrfach für die verschiedene Routingereignisse, so dass Sie für einen bestimmten filtern mögen.