تحويل مفتاح System.Windows.Input.KeyEventArgs إلى شار
-
21-08-2019 - |
سؤال
وأنا بحاجة للحصول على وسائط الحدث بأنه char
، ولكن عندما أحاول صب التعداد مفتاح أحصل على الحروف والرموز مختلفة تماما عن ما صدر في.
وكيف صحيح تحويل مفتاح شار؟
وهذا ما حاولت
ObserveKeyStroke(this, new ObervableKeyStrokeEvent((char)((KeyEventArgs)e.StagingItem.Input).Key));
وتحرير: أنا أيضا لا يوجد لديك خاصية الرمز الرئيسي على وسائط. أنا الحصول عليها من الحدث InputManager.Current.PreNotifyInput.
المحلول
كيفية تحويل حرف في لقيمة System.Windows.Input.Key التعداد مشابهة؟
استخدام KeyInterop.VirtualKeyFromKey
بدلا من ذلك.
نصائح أخرى
ويستغرق قليلا تعتاد، ولكن يمكنك فقط استخدام القيم الأساسية نفسها. إذا كنت تحاول للحد من المدخلات إلى أبجدية رقمية وربما قليلا اضافية، رمز أدناه قد تساعد.
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;
}
}
وهذا العمل بالنسبة لي:
واستنادا إلى البند الأخير وجدت أن في WPF لا يوجد مثل PreNotifyInput
الحدث، ولكن وجدت وPreviewTextInput
يعادل
والأولى وأنا أحاول مع RegExp
، لكنني غير قادر على العمل على انجاحه، ثم يمكنني استخدام 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;
}
وأعرف أن هذا هو القديم، ولكن أيا من الإجابات يبدو أن الإجابة في الواقع هذا السؤال. السبب شار مختلفة يعود هو لأنه عندما كنت مجرد محاولة تحويل ذلك إلى char
كنت صب قيمة التعداد إلى "شار". ولكن:
var keyPressed = e.key.ToString();
وتعمل كبرى. إرجاع مفتاح ضغط كسلسلة. ثم قمت بالتدقيق في الطول. اذا كان == 1 ثم انها شار أو رقم أو رمز. إذا كان أكبر من 1 انها مفتاح خاص.
إذا كنت ترغب فقط شار ثم يمكنك القيام keyPressed[0];
وهذا هو كيف أفعل ذلك.
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)
}
}
وداخل معالج PreNotifyInput، حاول شيئا من هذا القبيل:
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];
}
}
وهذا يثير عدة مرات للأحداث الموجهة مختلفة، لذلك قد ترغب في تصفية واحد بعينه.