2009-05-12 14 views
10

मैं एक char के रूप में घटना args प्राप्त करने की आवश्यकता के लिए एक System.Windows.Input.KeyEventArgs कुंजी कन्वर्ट, लेकिन जब मैं कुंजी enum कास्टिंग की कोशिश मैं पूरी तरह से अलग पत्र और क्या में पारित किया गया था की तुलना में प्रतीकों मिलता है।एक चार

आप कुंजी को एक char में सही तरीके से कैसे परिवर्तित करते हैं?

यह मैं क्या कोशिश की है

ObserveKeyStroke(this, new ObervableKeyStrokeEvent((char)((KeyEventArgs)e.StagingItem.Input).Key)); 

संपादित है: मैं भी आर्ग पर कीकोड संपत्ति नहीं है। मैं उन्हें InputManager.Current.PreNotifyInput ईवेंट से प्राप्त कर रहा हूं।

उत्तर

11

How to convert a character in to equivalent System.Windows.Input.Key Enum value? इसके बजाय KeyInterop.VirtualKeyFromKey का उपयोग करें।

+1

यह वास्तव में काम नहीं करता है। यदि आप किसी चरित्र या संख्या के अलावा कुछ भी दबाते हैं, तो आपको एक यादृच्छिक अन्य चरित्र मिलता है। – Jules

2

इसमें थोड़ा सा उपयोग होता है, लेकिन आप केवल मुख्य मानों का उपयोग कर सकते हैं। यदि आप अल्फान्यूमेरिक्स में इनपुट सीमित करने की कोशिश कर रहे हैं और शायद थोड़ा अतिरिक्त, नीचे दिया गया कोड मदद कर सकता है। तो आप एक विशेष एक के लिए फिल्टर करने के लिए चाहते हो सकता है,

 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]; 
      } 
     } 

यह अलग कराई घटनाओं के लिए कई बार उठता है:

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

अपने PreNotifyInput हैंडलर के अंदर, कुछ इस तरह की कोशिश करो।

2

कि मेरे लिए काम:

अंतिम प्रविष्टि मैंने पाया 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; 
} 
1

मुझे पता है कि यह पुराना है, लेकिन कोई भी जवाब वास्तव में प्रश्न का उत्तर देने लगता है। एक अलग चार वापस आने का कारण यह है कि जब आप इसे char पर डालने का प्रयास करते हैं तो आप enum मान को 'char' पर कास्टिंग कर रहे हैं। हालांकि:

var keyPressed = e.key.ToString(); 

बढ़िया काम करता है। स्ट्रिंग के रूप में दबाए गए कुंजी को वापस करता है। फिर आप लंबाई की जांच करें। यदि यह == 1 है तो यह एक char, संख्या या प्रतीक है। यदि यह 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) 
    } 
}