कस्टम WPF कमांड पैटर्न उदाहरण

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

0
ro fr bn

4 उत्तर

आह हे! एक सवाल मैं जवाब दे सकता हूँ! सबसे पहले, मुझे यह उल्लेख करना चाहिए कि मैंने व्यक्तिगत रूप से एक्सएएमएल की बजाय कोड में कमांड को परिभाषित करना और हुक करना आसान पाया है। यह मुझे सभी 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;
   //...
  }

 //....
}

इसके बाद मैं विंडोक्लोसिंग और विंडोक्लोज्ड इवेंट्स के लिए इवेंट हैंडलर भी करता हूं, मैं आपको आदेशों के वास्तविक कार्यान्वयन को जितना संभव हो सके छोटे और सामान्य के रूप में करने की सलाह देता हूं। इस मामले में, मैंने कोड डालने का प्रयास नहीं किया जो सहेजे गए डेटा के विंडो को बंद करने से रोकने का प्रयास करता है, मैंने उस कोड को विंडोक्लोसिंग ईवेंट के अंदर दृढ़ता से रखा है।

अगर आपके पास कोई फॉलो अप प्रश्न हैं तो मुझे बताएं। :)

0
जोड़ा
आपका CanExecuteIfParameterIsNotNull में मेरे पालतू परेशानियों में से एक है। क्यों न सिर्फ e.CanExecute = ई। पैरामीटर! = शून्य;
जोड़ा लेखक Ray, स्रोत
@ रे वह कुछ नहीं था जो मुझे पता था कि मैं कर सकता था! संपादन ड्रू के लिए धन्यवाद। :)
जोड़ा लेखक Nidonocu, स्रोत

एक्सएएमएल के बारे में बात यह है कि यह 'सरल' कार्यक्रमों के लिए ठीक है, लेकिन दुख की बात है, जब आप शेयर फ़ंक्शंस जैसी चीजें करना चाहते हैं तो यह अच्छी तरह से काम नहीं करता है। मान लें कि आपके पास कई कक्षाएं और यूआई हैं जिनमें से सभी आदेशों को कभी अक्षम नहीं किया गया था, आपको प्रत्येक विंडो या उपयोगकर्ता नियंत्रण के लिए 'CanAlwaysExecute' विधि लिखनी होगी! यह सिर्फ DRY नहीं है।

कई ब्लॉग पढ़ने और कई चीजों की कोशिश करने के बाद, मैंने एक्सएएमएल को दिखने, शैलियों, एनीमेशन और ट्रिगर्स के बारे में पूरी तरह से बनाने का विकल्प चुना है। ईवेंट हैंडलर और कमांडिंग की मेरी सभी हुकिंग अब कोड-बैक में नीचे आ गई है। :)

रास्ते में एक और गॉचा इनपुट बाध्यकारी है, ताकि उन्हें पकड़ा जा सके, फोकस उस ऑब्जेक्ट पर होना चाहिए जिसमें इनपुट बाइंडिंग हों। उदाहरण के लिए, एक छोटा सा कट करने के लिए आप किसी भी समय (कहें, सहायता खोलने के लिए एफ 1) का उपयोग कर सकते हैं, कि इनपुट बाध्यकारी विंडो ऑब्जेक्ट पर सेट की जानी चाहिए, क्योंकि जब आपका ऐप सक्रिय होता है तो हमेशा ध्यान केंद्रित होता है। कोड विधि का उपयोग करना इतना आसान बनाना चाहिए, भले ही आप UserControls का उपयोग शुरू करें, जो कि उनके मूल विंडो में इनपुट बाइंडिंग जोड़ना चाहें।

0
जोड़ा

एमएसडीएन पत्रिका के सितंबर 2008 के संस्करण में, ब्रायन नोयस के पास रूटेड कॉमांड/रूटेड एवेन्ट्स के बारे में एक उत्कृष्ट लेख है !!!

Here is the link: http://msdn.microsoft.com/en-us/magazine/cc785480.aspx

0
जोड़ा
लिंक मर चुका है ...
जोड़ा लेखक ardila, स्रोत

I blogged about a bunch of resources on wpf Commands along with an example last year at http://blogs.vertigo.com/personal/alanl/Blog/archive/2007/05/31/commands-in-wpf.aspx

यहां पेस्ट करना:

Adam Nathan?s sample chapter on Important New Concepts in WPF: Commands

एमएसडीएन लेख: डब्ल्यूपीएफ में कमांड पैटर्न

Keyvan Nayyeri: कस्टम wpf नियंत्रण में कमांड कैसे जोड़ें

इयान ग्रिफिथ्स: एवलॉन इनपुट, कमांड, और हैंडलर

विकिपीडिया: कमांड पैटर्न

एमएसडीएन लाइब्रेरी: कमांडिंग अवलोकन

एमएसडीएन लाइब्रेरी: कमांड बाइंडिंग क्लास

एमएसडीएन लाइब्रेरी: इनपुट और कमांड कैसे करें विषय

एमएसडीएन लाइब्रेरी: संपादन कमांड क्लास

एमएसडीएन लाइब्रेरी: मीडिया कमांड क्लास

एमएसडीएन लाइब्रेरी: एप्लिकेशन कमांड क्लास

एमएसडीएन लाइब्रेरी: नेविगेशन कमांड क्लास

एमएसडीएन लाइब्रेरी: घटक कॉमांड क्लास

Also buried in the wpf SDK samples, there's a nice sample on RichTextBox editing which I've extended. You can find it here: RichTextEditor.zip

0
जोड़ा
जोड़ा लेखक Drahakar, स्रोत