2010-01-25 8 views
11

मेरे आवेदन में, मैं उपयोगकर्ताओं को कीबोर्ड शॉर्टकट को कस्टमाइज़ करना चाहता हूं, जैसा कि यह विजुअल स्टूडियो के कीबोर्ड विकल्पों में किया गया है। उपयोगकर्ता रिक्त टेक्स्ट बॉक्स पर फ़ोकस कर सकता है और उसके बाद कोई शॉर्टकट टाइप कर सकता है जिसे वह कमांड को असाइन करना चाहता है।मैं WPF में उपयोगकर्ता से कस्टम कीबोर्ड शॉर्टकट कैसे पढ़ूं?

टेक्स्टबॉक्स की सदस्यता लेना सबसे नज़दीकी है। टेक्स्टव्यूडाउन घटना, इसे टेक्स्ट बॉक्स में वास्तविक टेक्स्ट इनपुट को रोकने के लिए इसे संभालने के रूप में सेट किया गया है। मैं फिर संशोधक कुंजी से जुड़े कीडाउन घटनाओं को अनदेखा करता हूं (क्या यह निर्धारित करने का एक क्लीनर तरीका है कि कुंजी एक संशोधक कुंजी है या नहीं?)।

// Code-behind 
private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    // The text box grabs all input 
    e.Handled = true; 

    if (e.Key == Key.LeftCtrl || 
     e.Key == Key.RightCtrl || 
     e.Key == Key.LeftAlt || 
     e.Key == Key.RightAlt || 
     e.Key == Key.LeftShift || 
     e.Key == Key.RightShift) 
     return; 

    string shortcutText = ""; 
    if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
     shortcutText += "Ctrl+"; 
    if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
     shortcutText += "Shift+"; 
    if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt) 
     shortcutText += "Alt+"; 
    _ShortcutTextBox.Text = shortcutText + e.Key.ToString(); 

} 

ऊपर दिए गए किसी भी शॉर्टकट के लिए Ctrl और Ctrl + Shift से प्रारंभ होता है, लेकिन किसी भी Alt शॉर्टकट के लिए विफल रहता है। जब मैं Alt युक्त शॉर्टकट दबाता हूं तो e.Key हमेशा Key.System पर सेट होता है।

मैं उपयोगकर्ता से Alt शॉर्टकट कैसे रिकॉर्ड कर सकता हूं? उपयोगकर्ता को शॉर्टकट रिकॉर्ड करने के लिए एक बेहतर, अधिक मजबूत तरीका है?

+0

मुझे लगता है कि एक कुंजी कुंजी कॉम्बो को कैप्चर करने के लिए डब्लूपीएफ द्वारा अल्टी कुंजी का उपयोग किया जाता है जो एक नियंत्रण पर ध्यान केंद्रित करने के लिए होता है जो एक स्नेही शॉर्टकट वाले लेबल से बंधे होते हैं (जैसे _File मेनू के लिए Alt + F, या Alt + O _ ओके बटन के लिए)। शायद इसे रोकने या ओवरराइड करने का कोई तरीका है? –

उत्तर

23

चाल SystemKey संपत्ति का उपयोग करने के Key संपत्ति Key.System पर सेट है है:

private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    // The text box grabs all input. 
    e.Handled = true; 

    // Fetch the actual shortcut key. 
    Key key = (e.Key == Key.System ? e.SystemKey : e.Key); 

    // Ignore modifier keys. 
    if (key == Key.LeftShift || key == Key.RightShift 
     || key == Key.LeftCtrl || key == Key.RightCtrl 
     || key == Key.LeftAlt || key == Key.RightAlt 
     || key == Key.LWin || key == Key.RWin) { 
     return; 
    } 

    // Build the shortcut key name. 
    StringBuilder shortcutText = new StringBuilder(); 
    if ((Keyboard.Modifiers & ModifierKeys.Control) != 0) { 
     shortcutText.Append("Ctrl+"); 
    } 
    if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0) { 
     shortcutText.Append("Shift+"); 
    } 
    if ((Keyboard.Modifiers & ModifierKeys.Alt) != 0) { 
     shortcutText.Append("Alt+"); 
    } 
    shortcutText.Append(key.ToString()); 

    // Update the text box. 
    _ShortcutTextBox.Text = shortcutText.ToString(); 
} 

मैं जोड़ा संशोधक सूची में बाएं और दाएं Windows कुंजी, क्योंकि कभी-कभी शॉर्टकट कुंजी नाम में दिखाई देता है जब एक जटिल (Ctrl+Shift+Alt) कुंजी संयोजन टर्मिनल सर्वर सत्र से टाइप किया गया था। वे कभी भी Keyboard.Modifiers में मौजूद नहीं हैं, हालांकि, वे वैश्विक शॉर्टकट के लिए आरक्षित हैं, इसलिए मैं उन्हें वहां संभाल नहीं पाता हूं।

मैंने StringBuilder का उपयोग भी string उदाहरणों से बचने के लिए किया था।

यह समाधान किसी भी महत्वपूर्ण संयोजन के साथ काम करता है, Shift+Alt को छोड़कर (उस मामले में Alt संशोधक नहीं देखा जाता है)। यह मेरे टर्मिनल सर्वर पर्यावरण का एक आर्टिफैक्ट हो सकता है, हालांकि, आपका माइलेज भिन्न हो सकता है।

अंत में, मैं खिड़की के लिए एक _File मेनू जोड़ा देखने के लिए क्या होगा, और इससे पहले कि यह मेनू, जो तुम क्या चाहते हो रहा है पहुँचता है Alt+F शॉर्टकट कुंजी को प्रभावी ढंग से पाठ बॉक्स में फंस गया है।

+0

+1, मेरा से बेहतर समाधान। कुंजी कुंजी = (e.Key == कुंजी। सिस्टम? E.SystemKey: e.Key) के बारे में नहीं पता था; चाल :) –

+0

काम करता है! आपको बहुत - बहुत धन्यवाद! –

+0

अच्छा, साझा करने के लिए धन्यवाद! – Califf

-1

हाय
अगर You used WPF-Command अपने आवेदन में आप इस का उपयोग कर सकते हैं:

<Window.InputBindings> 
    <KeyBinding Command="YourCommnad" 
       Gesture="CTRL+C" /> 
</Window.InputBindings> 
+1

यह प्रश्न का उत्तर नहीं देता है। प्रश्न यह है कि टेक्स्ट बॉक्स में कुंजियों के संयोजन को कैसे पढ़ा जाए, एक्सएएमएल में हॉटकी को कैसे परिभाषित नहीं किया जाए। – alexandrudicu

+1

हालांकि यह मूल पोस्टर के प्रश्न का उत्तर नहीं देता है, वस्तुतः वह जवाब है जब मैं इस थ्रेड पर गुगल के माध्यम से ठोकर खा रहा था। तो बस 2016 में अन्य लोगों को जानना चाहते हैं, यह पूरी खिड़की कीबाइंडिंग का एक अच्छा समाधान है। – Kikootwo