2010-04-19 13 views
5

मैं अपनी WPF विंडो को बंद करने के लिए एस्केप कुंजी चाहता हूं। हालांकि अगर कोई नियंत्रण है जो कि एस्केप कुंजी का उपभोग कर सकता है, तो मैं विंडो को बंद नहीं करना चाहता हूं। ईएससी कुंजी दबाए जाने पर WPF विंडो को बंद करने के तरीके पर कई समाधान हैं। जैसे। How does the WPF Button.IsCancel property work?WPF विंडो में "Esc" कुंजी कैसे संभाली जाती है?

हालांकि यह समाधान विंडो को बंद कर देता है, भले ही कोई सक्रिय नियंत्रण हो जो एस्केप कुंजी का उपभोग कर सके।

उदाहरण के लिए। मेरे पास डेटाग्रिड वाला एक विंडो है। डेटाग्रिड पर कॉलम में से एक एक combobox है। अगर मैं कॉम्बोबॉक्स बदल रहा हूं, और एस्केप हिट करता हूं, तो नियंत्रण कॉम्बोबॉक्स (सामान्य व्यवहार) के संपादन से बाहर आना चाहिए। और अगर अब मैं एस्केप फिर से हिट करता हूं, तो विंडो बंद होनी चाहिए। मुझे बहुत सारे कस्टम कोड लिखने के बजाय एक सामान्य समाधान चाहिए।

यदि आप सी # में समाधान प्रदान कर सकते हैं तो यह बहुत अच्छा होगा।

उत्तर

3

तुम बस PreviewKeyDown घटना के बजाय KeyDown घटना का उपयोग करना चाहिए। यदि Window का कोई भी बच्चा ईवेंट को संभालता है, तो उसे Window नीचे विंडो (PreviewKeyDown सुरंगों) तक बुलबुला नहीं किया जाएगा, और इसलिए आपका ईवेंट हैंडलर नहीं बुलाया जाएगा।

+0

यह मेरे लिए काम करता है। हालांकि सभी मामलों में नहीं। विशेष रूप से, मैं टेलीरिक के डेटाग्रिड नियंत्रण का उपयोग कर रहा हूं। यदि किसी सेल में कॉम्बो बॉक्स होता है, और इसे विस्तारित किया जाता है, और फिर मैंने एस्केप मारा, तो एस्केप कुंजी विंडो पर प्रचारित नहीं होती है। हालांकि, यदि कॉम्बोबॉक्स का विस्तार नहीं किया गया है, लेकिन संपादन मोड में, तो एस्केप कुंजी प्रचारित की जाती है। मुझे लगता है कि यह नियंत्रण के साथ एक बग हो सकता है। आपका सुझाव काम करता है। – Markus2k

1

एक आसान तरीका हो सकता है, लेकिन आप इसे हैश कोड के साथ कर सकते हैं। Keys.Escape एक और विकल्प है, लेकिन कभी-कभी मैं इसे किसी कारण से काम नहीं कर सकता। आप एक ऐसी भाषा इसलिए यहाँ निर्दिष्ट नहीं किया VB.NET में एक उदाहरण है:

Private Sub someTextField_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles someTextField.KeyPress 

    If e.KeyChar.GetHashCode = 1769499 Then ''this number is the hash code for escape on my computer, do not know if it is the same for all computers though. 
     MsgBox("escape pressed") ''put some logic in here that determines what ever you wanted to know about your "active control" 
    End If 

End Sub 
+0

उत्तर देने के लिए धन्यवाद। जिस भाषा में मुझे रूचि है वह सी # है। मैं इस समस्या का एक सामान्य समाधान ढूंढ रहा हूं। मैं हर नियंत्रण के लिए विशिष्ट कोड नहीं चाहता हूं। – Markus2k

1
class Commands 
{ 
    static Command 
    { 
     CloseWindow = NewCommand("Close Window", "CloseWindow", new KeyGesture(Key.Escape)); 
     CloseWindowDefaultBinding = new CommandBinding(CloseWindow, 
      CloseWindowExecute, CloseWindowCanExecute); 
    } 

    public static CommandBinding CloseWindowDefaultBinding { get; private set; } 
    public static RoutedUICommand CloseWindow { get; private set; } 

    static void CloseWindowCanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = sender != null && sender is System.Windows.Window; 
     e.Handled = true; 
    } 
    static void CloseWindowExecute(object sender, ExecutedRoutedEventArgs e) 
    { 
     ((System.Windows.Window)sender).Close(); 
    } 
} 

// In your window class's constructor. This could also be done 
// as a static resource in the window's XAML resources. 
CommandBindings.Add(Commands.CloseWindowDefaultBinding); 
संबंधित मुद्दे