आह हे! एक सवाल मैं जवाब दे सकता हूँ! सबसे पहले, मुझे यह उल्लेख करना चाहिए कि मैंने व्यक्तिगत रूप से एक्सएएमएल की बजाय कोड में कमांड को परिभाषित करना और हुक करना आसान पाया है। यह मुझे सभी XAML दृष्टिकोण की तुलना में कमांडरों के लिए हैंडलर को थोड़ा अधिक लचीला रूप से जोड़ने की अनुमति देता है।
आपको यह निर्धारित करना चाहिए कि आप कौन से आदेश चाहते हैं और वे क्या संबंधित हैं। मेरे आवेदन में, वर्तमान में मेरे पास महत्वपूर्ण एप्लिकेशन कमांड को परिभाषित करने के लिए एक कक्षा है:
public static class CommandBank
{
/// Command definition for Closing a window
public static RoutedUICommand CloseWindow { get; private set; }
/// Static private constructor, sets up all application wide commands.
static CommandBank()
{
CloseWindow = new RoutedUICommand();
CloseWindow.InputGestures.Add(new KeyGesture(Key.F4, ModifierKeys.Alt));
//...
}
अब, क्योंकि मैं कोड को सभी एक साथ रखना चाहता था, कोड का उपयोग करके केवल कमांड के पास पहुंचने से मुझे उपरोक्त वर्ग में निम्नलिखित विधियां मिलती हैं:
/// Closes the window provided as a parameter
public static void CloseWindowExecute(object sender, ExecutedRoutedEventArgs e)
{
((Window)e.Parameter).Close();
}
/// Allows a Command to execute if the CommandParameter is not a null value
public static void CanExecuteIfParameterIsNotNull(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = e.Parameter != null;
e.Handled = true;
}
दूसरी विधि को अन्य कमांडों के साथ भी साझा किया जा सकता है, बिना मुझे जगह पर इसे दोहराना पड़ता है।
एक बार जब आप इस तरह के आदेशों को परिभाषित कर लेंगे, तो आप उन्हें यूआई के किसी भी हिस्से में जोड़ सकते हैं। निम्न में, विंडो लोड हो जाने के बाद, मैं विंडो और मेनू इटिम दोनों को कमांड बाइंडिंग जोड़ता हूं और फिर सभी कमांड बाइंडिंग के लिए ऐसा करने के लिए लूप का उपयोग करके विंडो में बाध्यकारी इनपुट जोड़ता हूं। पास किया गया पैरामीटर विंडो स्वयं है इसलिए ऊपर दिया गया कोड जानता है कि विंडो किस कोशिश करने और बंद करने के लिए है।
public partial class SimpleWindow : Window
{
private void WindowLoaded(object sender, RoutedEventArgs e)
{
//...
this.CommandBindings.Add(
new CommandBinding(
CommandBank.CloseWindow,
CommandBank.CloseWindowExecute,
CommandBank.CanExecuteIfParameterIsNotNull));
foreach (CommandBinding binding in this.CommandBindings)
{
RoutedCommand command = (RoutedCommand)binding.Command;
if (command.InputGestures.Count > 0)
{
foreach (InputGesture gesture in command.InputGestures)
{
var iBind = new InputBinding(command, gesture);
iBind.CommandParameter = this;
this.InputBindings.Add(iBind);
}
}
}
//menuItemExit is defined in XAML
menuItemExit.Command = CommandBank.CloseWindow;
menuItemExit.CommandParameter = this;
//...
}
//....
}
इसके बाद मैं विंडोक्लोसिंग और विंडोक्लोज्ड इवेंट्स के लिए इवेंट हैंडलर भी करता हूं, मैं आपको आदेशों के वास्तविक कार्यान्वयन को जितना संभव हो सके छोटे और सामान्य के रूप में करने की सलाह देता हूं। इस मामले में, मैंने कोड डालने का प्रयास नहीं किया जो सहेजे गए डेटा के विंडो को बंद करने से रोकने का प्रयास करता है, मैंने उस कोड को विंडोक्लोसिंग ईवेंट के अंदर दृढ़ता से रखा है।
अगर आपके पास कोई फॉलो अप प्रश्न हैं तो मुझे बताएं। :)