2017-01-04 7 views
7

मैं शैल विंडो में विभिन्न विचारों के लिए वीएम राज्य के प्रबंधन के बीच स्विच करने की कोशिश कर रहा हूं, साथ ही कई संपादन संवाद, मोडल या गैर-मोडल और राज्य के लिए वीएम राज्य के साथ खिड़कियों के लिए खुद के लिए।डब्ल्यूपीएफ और प्रिज्म के लिए सामान्य संवाद विंडो

अब मैं एक खोल खिड़की के साथ फिर से शुरू करना चाहता हूं, और केवल एक संवाद विंडो की उम्मीद कर रहा हूं, तो मेरी खिड़कियां और वीएमएस में बहुत कम युग्मन है, और मैं संवाद के प्रबंधन में खोल के वीएम प्रबंधन पैटर्न उधार ले सकता हूं।

मुझे पॉपअप और कम सामान्यीकृत गैर-मोडल के प्रबंधन के लिए काफी मार्गदर्शन मिलता है, लेकिन क्या विभिन्न वीएम होस्ट करने के लिए केवल एक संवाद का उपयोग करने के लिए कोई स्थापित पैटर्न या मार्गदर्शन है? इससे भी बेहतर, क्या प्रिज्म में ऐसी कोई कार्यक्षमता पहले से उपलब्ध है?

मैं वास्तव में डीआरवाई सिद्धांत को चिपकाना चाहता हूं, और दोनों विचारों में विरासत और वीएम जटिलताओं को जोड़ रहा है, जिसे मैं जल्दी पहले पुनरावृत्ति प्रोटोटाइप के रूप में नहीं ले सकता।

उत्तर

1

यह वास्तव में काफी सरल है, लेकिन इसमें कुछ जटिलताएं हैं। सबसे पहले, आप एक कस्टम संवाद सेवा बनाना चाहते हैं। यह सेवा जितनी चाहें उतनी सरल या जटिल हो सकती है। यह सेवा जो मुख्य काम करेगी वह एक संवाद दिखाती है जिसे इसे अपने स्वयं के खोल के रूप में माना जाता है। मतलब यह है कि संवाद समान होगा, लेकिन जब आप इसे कॉल करते हैं तो उस सूचना के आधार पर संवाद के भीतर सामग्री अलग-अलग होगी। तो इसका मतलब है अपने स्वयं के क्षेत्रों के साथ एक कस्टम संवाद। संवाद खोल में विभिन्न विचारों का उपयोग करके संभाल करने के लिए, मैं नेविगेशन सेवा का उपयोग करूंगा।

आपका संवाद कुछ इस तरह दिख सकता है:

public interface IDialogService 
{ 
    void ShowDialog(string uri); 
} 

public class DialogService : IDialogService 
{ 
    private readonly IUnityContainer _container; 
    private readonly IRegionManager _regionManager; 

    public DialogService(IUnityContainer container, IRegionManager regionManager) 
    { 
     _container = container; 
     _regionManager = regionManager; 
    } 

    public void ShowDialog(string uri) 
    { 
     var dialog = _container.Resolve<DialogShell>(); 
     //use a scoped region just in case you can have multiple instances 
     var scopedRegion = _regionManager.CreateRegionManager(); 
     //set the region manager of the dialog to the scoped region 
     RegionManager.SetRegionManager(dialog, scopedRegion); 
     //navigate to show the desired view in the dialog 
     scopedRegion.RequestNavigate(KnownRegionNames.ContentRegion, uri); 
     //show the dialog 
     dialog.Show(); 
    } 
} 

आप वास्तव में अपनी आवश्यकताओं फिट करने के लिए इस दृष्टिकोण को बदल सकते हैं, लेकिन आप विचार मिलता है।

संपादित करें: मैं यह भी उल्लेख करना चाहता हूं कि आप इसके संवाद को इसके भीतर अपनी अलग नेविगेशन रखने और दिखाए गए प्रत्येक उदाहरण के लिए अद्वितीय होने के कारण भी पागल हो सकते हैं। मेरे पास एक प्लुरसाइट कोर्स है जो दिखाता है कि यदि आप रुचि रखते हैं तो इसे कैसे करें। https://www.pluralsight.com/courses/prism-showing-multiple-shells

+0

कुछ अनुकूलन के साथ यह प्रयोग योग्य दिखता है।मैं नेविगेशन, सिर्फ सादा मेनू और बटन कमांड का उपयोग नहीं कर रहा हूं, लेकिन यह इस परिदृश्य में सिर्फ छोटी बात है। और बाद में। धन्यवाद। – ProfK

+0

चूंकि यह आपकी समस्या का एक व्यावहारिक समाधान है, इसे उत्तर के रूप में चिह्नित करने के बारे में कैसे? –

4

खैर मैं बॉक्स समाधान से बाहर किसी भी के बारे में पता नहीं है, लेकिन इस तरह के एक पुन: प्रयोज्य संवाद कार्यान्वयन बनाने कि मुश्किल नहीं है। असल में, मैंने कुछ साल पहले इस तरह कुछ लागू किया था। वैसे यह एक और नौकरी में था, इसलिए मुझे अब कोड तक पहुंच नहीं है। इसके अतिरिक्त, मुझे सभी विवरण याद नहीं हैं, लेकिन मैं आपको इस तरह के कार्यान्वयन का मूल विचार देने की कोशिश कर सकता हूं।

आप DialogVm बना सकते हैं, जो सामान्य संवाद कार्यक्षमता प्रदान कर रहा है।

सबसे पहले, प्रस्तुति परत में एक संवाद के लिए क्या आवश्यक है? आमतौर पर, तीन बटन, की तरह ...

  • लागू करें, रद्द और बंद (संशोधन संवाद)
  • ठीक और रद्द या हाँ और नहीं (प्रश्न संवाद)
  • ठीक (संदेश बॉक्स के मामले में)

तो जैसा कि आप देख सकते हैं, तो आप तीन आदेश (ICommanddoc) की जरूरत है। असल में, मैंने DelegateCommand कार्यान्वयन बनाया है (this पर आधारित)। ICommand.CanExecute निर्धारित करता है कि बाध्य बटन अक्षम या सक्षम है या नहीं। यदि कोई आदेश शून्य है, तो बटन छुपाया जाना चाहिए।

(आप सही लेआउट नियंत्रण का उपयोग कर रहे हैं, बटन की स्थिति, ठीक से समायोजित कर रहे हैं एक बटन नहीं दिखाया गया है।)

ऊपर चार से अधिक परिदृश्यों के लिए समर्थन प्रदान करने के लिए, मैं CommandTitle संपत्ति DelegateCommand पर जोड़ा गया, ताकि बटन की सामग्री वहां से आ रही है।

अगला बात आपको संवाद के शीर्षक के लिए Title संपत्ति की आवश्यकता होगी। तो इसे DialogVm पर जोड़ें।

यदि आप कमांड निष्पादित करके संवाद को बंद करने में सक्षम होना चाहते हैं (केवल आवश्यक है, यदि यह Window का बच्चा है), तो आप this approach का पालन कर सकते हैं। बेशक मैंने संस्करण का उपयोग किया है, जिसे मैंने वहां वर्णित किया है। लेकिन अन्य भी आशाजनक दिख रहे हैं।

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

यह केवल downsite, है केवल एक अच्छा दृष्टिकोण, यह अगर आप केवल कुछ अलग संवाद प्रकार है (जैसे प्रश्न बॉक्स, संदेश बॉक्स ...)

उपयोग बहुत आसान है। सीधे शब्दों में, वांछित ICommand तर्क, DialogContentVm (जब चाहें इसका कॉल करने के लिए), यह DialogWindow के पास के साथ एक DialogVm उदाहरण प्रारंभ (शायद, आप sth उपयोग करना चाहते हैं। विभिन्न जैसे एक flyout) और को प्रस्तुत उपभोक्ता।

अच्छी तरह से मुझे उम्मीद है कि यह मदद करता है। अगर आपको अधिक जानकारी या कोई मदद चाहिए, तो कृपया मुझे बताएं।

+0

धन्यवाद। 'डेटा टेम्पलेट' उपयोग को छोड़कर, जो भी आप सुझाते हैं उसके करीब जो कुछ है, उसके करीब है। वेब देव डब्ल्यूपीएफ पर हाल के 2 से 3 वर्षों से कई साल पहले मेरी मुख्य लाइन थी, इसलिए मैं सिर्फ एक सरल 'उपयोगकर्ता नियंत्रण' दृश्य के रूप में उपयोग करता हूं, जो विंडो में 'ContentControl' से जुड़ा हुआ है। फिर टेम्पलेट्स चुनने के बजाय, मेरा उद्देश्य प्रिज्म के वीएम ऑटो-वायर का उपयोग करना है, इसलिए मेरा 'शोव्यू' कमांड दृश्य दृश्य को हल करने के लिए केवल उन्नी का उपयोग करता है, और वीएम पहले से ही बाध्य है। – ProfK

+0

@ProfK: आह, यह 'DataTemplate' दृष्टिकोण से बेहतर विकल्प प्रतीत होता है। संकेत के लिए धन्यवाद। :) – DHN

+0

कृपया बक्षीस से नाराज मत बनो। मुझे कोई संदेह नहीं है कि आपकी सलाह विश्वसनीय है, लेकिन यह शुद्ध WPF है और प्रिज्म आधारित नहीं है, और मुझे उस ढांचे पर "अधिकारियों" से कुछ और जवाब चाहिए। उस विकल्प बटन के एसओ शब्द के लिए दुर्भाग्यपूर्ण। – ProfK

संबंधित मुद्दे