2009-02-17 11 views
5

मैं आज किसी के साथ अपने WPF प्रोग्राम में तर्क को संभालने के लिए एक डिज़ाइन पैटर्न चुनने और निर्णय लेने के बारे में सोच रहा था कि एसओ समुदाय निर्णय को आसान बनाने के लिए और सलाह के साथ मदद कर सकता है। कमांड के पक्ष में कौन से कारक असुविधा से अधिक हैं? बटन और मेनू परडब्ल्यूपीएफ?

  1. उपयोग क्लिक करें ईवेंट हैंडलर्स:

    मैं एक पूर्ण sample पहले तीन में से दो तरीकों में से कुछ UML diagrams के साथ तैयार किया।

  2. एक्सएएमएल में बंधे आदेशों का उपयोग करें।
  3. शुद्ध GUI लेआउट और स्टाइल के लिए बनाए गए XAML के साथ कोड में बाध्य आदेशों का उपयोग करें।

वह प्रारंभिक पाठ्यक्रम जिस पर वह रहा था और कई पुस्तकों में सरल क्लिक ईवेंट हैंडलर को यूआई ऑब्जेक्ट्स को तर्क जोड़ने के प्राकृतिक तरीके के रूप में दिखाया गया है।

वह थोड़ा भूमि के ऊपर की राशि दोनों कमांड के साथ आदेशों का उपयोग करने के लिए आवश्यक द्वारा दंग रह फ़ाइल के पीछे कोड में बनाया जा रहा था:

public static readonly ICommand cmdShow2 = new RoutedUICommand(
    "Show Window2", "cmdShow2", 
    typeof(TestDespatchWindow)); 

और फिर अधिक शब्दों वाले तरीके के साथ XAML में और भी अधिक कोड आदेश की पहचान की गई है और बाध्य:

<Window x:Class="WPFDispatchDemo.TestDespatchWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:w="clr-namespace:WPFDispatchDemo"..> 

    <Window.CommandBindings> 
     <CommandBinding Command="{x:Static w:TestDespatchWindow.cmdShow2}" 
     Executed="OnShow2" /> 
    </Window.CommandBindings> 
     <DockPanel> 
     <StackPanel Margin="0,8,0,0"> 
      <Button x:Name="Show2EventBased" 
        Margin="10,2,10,2" 
        Click="OnShow2" 
        Content="Show2 via WPF Event"/> 
      <Button x:Name="Show2Command" 
        Command="{x:Static w:TestDespatchWindow.cmdShow2}" 
        Margin="10,2,10,2" 
        Content="Show2 via WPF"/> 
     </StackPanel> 
    </DockPanel> 
    </Window> 

मैं नहीं कर सकते हैं (अभी तक) एक WPF विशेषज्ञ तो मैं और अधिक जटिल की तुलना में वे वास्तव में कर रहे हैं, लेकिन मेरा शक है के रूप में चीजों को चित्रित हो सकता है होना करने के लिए दावा है कि आप नहीं कर सकते उपर्युक्त की तुलना में चीजों को सरल बनाएं।

संपादित करें:

मैं एक दिलचस्प 3-way comparison DelegateCommand, RoutedCommand और घटना के बीच पाया।

+0

क्या यह एक सवाल है? –

+0

"आदेशों के पक्ष में कौन से कारक असुविधा से अधिक हैं?" मुझे एक सवाल की तरह दिखता है। मैंने सोचा कि पृष्ठभूमि की मात्रा लोगों के लिए यह आसान बना सकती है कि मैं गंभीर हूं और संदर्भ को समझता हूं। –

उत्तर

6

उनके फायदे और नुकसान को कम करता है, आपको अपनी स्थिति के आधार पर चयन करना होगा, मैं आपको सलाह देता हूं कि आप इस विकल्प को किसी मामले के आधार पर बनाएं, पूरी परियोजना के लिए "एक सही तरीका" चुनें।

कुछ मामलों के लिए प्रेषक और रिसीवर के बीच अलगाव और केवल एक्सएएमएल का उपयोग करके कमांड भेजने की क्षमता एक बड़ा फायदा है (अच्छे उदाहरण के लिए देखें कि स्क्रॉलबार नियंत्रण टेम्पलेट http://msdn.microsoft.com/en-us/library/ms742173.aspx पर नियंत्रण तर्क के साथ कैसे संचार करता है)।

अन्य मामलों में कमांड दो लाइनों इवेंट हैंडलर को बदल सकते हैं जो कि अनुप्रयोग में 4 अलग-अलग स्थानों को बदलने (How should the ViewModel close the form?) से जुड़े राक्षसों का पालन करना असंभव है।

3

एकमात्र कारण है कि आदेशों की रजिस्ट्री अच्छी तरह से जान लें। इसका मतलब है कि घटनाएं निजी तरीके होने की संभावना है और मुझे लगता है कि वे खिड़की के कोड से कड़े बंधे हैं। साथ ही कमांड्स कार्यान्वयन (घटना) और परिभाषा (कमांड) को अलग रखने की क्षमता देता है, आप एक और कक्षा का उपयोग भी कर सकते हैं (एप्लिकेशन कमांड पर एक नज़र डालें)।

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

मॉडल बनाएं।

public class Model 
{ 
    ICommand CloseMessagePopupCommand {get; set;} 
} 

फिर डाटा संदर्भ आवंटित

public MainWindow() 
{ 

    this.DataContext = new Model(); 
} 

और XAML कोड follwing उपयोग।

<Button 
    Command="{Binding CloseMessagePopupCommand}" 
    Content="{StaticResource Misc.Ok}" /> 
2

मैं आदेश पैटर्न है कि माइक जब WPF अनुप्रयोगों के विकास, एंडी # 2 और # 3 तरीकों का एक संयोजन का उपयोग करने के लिए संदर्भित करता है के लिए सही रहने के लिए प्रयास करें।

मैं अपने दृश्य में केवल एक ही कमांड के बारे में सोच सकता हूं: कुछ यूआई तत्वों के केवल कुछ ही क्रियाएं कमांड का आह्वान करती हैं। इसके आस-पास जाने का एक तरीका यह है कि आपका ईवेंट हैंडलर कमांड पर निष्पादन विधि को कॉल करें। मुझे लगता है कि आदेश निष्पादन तर्क को समाहित करने का एक बहुत अच्छा तरीका प्रदान करते हैं। यदि आप यूआई का एक बड़ा टुकड़ा बनाए रखते हैं और इसे एमवीसी/एमवीसी/एमवीवीएम पैटर्न का उपयोग करके कार्यान्वित करते हैं, तो यह बहुत स्पष्ट हो जाता है।

मैं आपको DataModel-View-ViewModel पैटर्न पर दान क्रेवियर की श्रृंखला को देखने के लिए प्रोत्साहित करता हूं, विशेष रूप से कमांड और एनकैप्सूलिंग कमांड पर अनुभाग। यहां तक ​​कि यदि यह पैटर्न आपकी आवश्यकताओं को पूरा नहीं करता है, तो यह एक अलग अवलोकन देता है कि आप एक अलग वर्ग के भीतर तर्क को कैसे समाहित कर सकते हैं।

1

आईसीओएमएंड पर अन्य बदलाव जटिल कमांड संरचनाओं को लागू करने के लिए एक लोकप्रिय तरीका प्रतीत होता है।

ब्रायन नॉयेस उसकी article on PRISM में कहते हैं

कराई WPF में आदेश बहुत शक्तिशाली और उपयोगी होते हैं, लेकिन जब एक समग्र आवेदन के लिए आवेदन किया है कि वे कुछ कमियों की है। पहला यह है कि वे पूरी तरह से दृश्य पेड़ के साथ मिलकर हैं- आक्रमणकारियों को दृश्य पेड़ का हिस्सा होना चाहिए, और बाध्यकारी आदेश को दृश्य पेड़ के माध्यम से बांधना होगा। ... दूसरी कमी यह है कि वे यूआई के फोकस पेड़ के साथ कसकर बंधे हुए हैं और डीएएलएएलएटी कॉमांड और कंपोजिट कमांड के बारे में बात करने के लिए आगे बढ़ते हैं, जिसमें सीएएल (प्रिज्म) शामिल है।