<Window ...>
<Grid>
<ContentPresenter x:Name="OriginalContent" />
<Rectangle>
<Rectangle.Fill>
<VisualBrush Visual="{Binding ElementName=OriginalContent}" />
</Rectangle.Fill>
</Rectangle>
</Grid>
</Window>
यह प्रोग्रामेटिक रूप से या विंडो पर टेम्पलेट का उपयोग करके किया जा सकता है, लेकिन मेरी प्राथमिकता कस्टम नियंत्रण बनाना और उपरोक्त संरचना को अपने टेम्पलेट का उपयोग करना है। यदि यह किया जाता है, तो आप बस इस के रूप में अपने विंडोज़ कोड कर सकते हैं:
<Window ...>
<my:SelectiveDisabler>
<Grid x:Name="LayoutRoot"> ... </Grid> <!-- Original content -->
</my:SelectiveDisabler>
</Window>
आयत करने के लिए माउस ईवेंट हैंडलर्स जोड़ने और निर्धारित करने के लिए क्या वस्तु मूल सामग्री में क्लिक किया गया था ContentPresenter पर VisualTreeHelper.HitTest
बुला करके। इस बिंदु से आप माउस ईवेंट को अनदेखा करना चुन सकते हैं, इसे प्रसंस्करण के लिए मूल सामग्री पर अग्रेषित कर सकते हैं, या आंखों की नली नियंत्रण या ऑब्जेक्ट चयन सुविधा के मामले में, वांछित वस्तुओं/जानकारी को निकालें।
MergedDictionary दृष्टिकोण
पर विवरण जाहिर है आप अपने पूरे एक ResourceDictionary का उपयोग कर यूआई अपने खिड़की के संसाधनों में विलय कर दिया restyle कर सकते हैं।
ऐसा करने का एक नैतिक तरीका है कि सभी टेक्स्टबॉक्स टेक्स्टबॉक्स के रूप में दिखाई देने के लिए विलय संसाधन संसाधन में अंतर्निहित शैलियों को बनाना है, सभी बटन सीमाओं के रूप में दिखाई देते हैं। यह बहुत अच्छी तरह से काम नहीं करता है क्योंकि किसी भी टेक्स्टबॉक्स को अपनी शैली या कंट्रोल टेम्पलेट स्पष्ट रूप से सेट अपडेट को याद कर सकता है। इसके अतिरिक्त, आपको वांछित सभी ऑब्जेक्ट्स नहीं मिल सकते हैं, और कमांड को आसानी से हटाने या बटन से ईवेंट पर क्लिक करने का कोई तरीका नहीं है क्योंकि उन्हें स्पष्ट रूप से निर्दिष्ट किया गया है और शैली उस पर ओवरराइड नहीं करेगी।
यह काम करने का एक बेहतर तरीका है विलय संसाधनों में शैलियों को एक संलग्न संपत्ति सेट करना है, फिर उन संपत्तियों को अद्यतन करने के लिए PropertyChangedCallback में कोड-बैक का उपयोग करें जिन्हें आप वास्तव में बदलना चाहते हैं। आपकी संलग्न "मोडलमोड" प्रॉपर्टी, यदि सत्य पर सेट की गई है, तो ऑब्जेक्ट पर एक निजी निर्भरता प्रॉपर्टी में कई गुणों (टेम्पलेट, कमांड, क्लिक, इज़ेनेबल इत्यादि) के लिए सभी स्थानीय मानों और बाइंडिंग को सहेज लेगी, फिर मानक मूल्यों के साथ इन्हें ओवरराइट करें । उदाहरण के लिए एक बटन की कमांड प्रॉपर्टी अस्थायी रूप से शून्य पर सेट की जाएगी। जब संलग्न "मोडलमोड" संपत्ति गलत हो जाती है, तो सभी मूल स्थानीय मूल्यों और बाइंडिंग को अस्थायी भंडारण से वापस कॉपी किया जाता है और अस्थायी संग्रहण साफ़ कर दिया जाता है।
यह विधि किसी अन्य संलग्न संपत्ति "IgnoreModalMode" को जोड़कर अपने यूआई के हिस्सों को चुनिंदा रूप से सक्षम/अक्षम करने का एक सुविधाजनक तरीका प्रदान करती है। आप मैन्युअल रूप से किसी भी UIElements पर इसे सही पर सेट कर सकते हैं जिसे आप नहीं चाहते हैं कि ModalMode पर लागू हो। आपका ModalMode PropertyChangedCallback तब यह जांचता है और यदि सत्य है, तो यह कुछ भी नहीं करता है।
InputManager दृष्टिकोण पर विवरण
आप माउस पर कब्जा, तो आप माउस प्राप्त कर सकते हैं कोई फर्क नहीं पड़ता है जहाँ यह ले जाया जाता है समन्वय करता है। CompositionTarget.TransformToDevice() का उपयोग करके स्क्रीन निर्देशांक में इनका अनुवाद करें, फिर प्रत्येक उम्मीदवार विंडो पर CompositionTarget.TransformFromDevice() का उपयोग करें।यदि माउस निर्देशांक सीमाओं में हैं, तो अक्षम विंडो को हिट-टेस्ट करें (यह तब भी किया जा सकता है जब कोई विंडो अक्षम हो), और यदि आप उस ऑब्जेक्ट को पसंद करते हैं जिस पर उपयोगकर्ता ने क्लिक किया है, तो माउस ईवेंट होने के कारण इनपुटमैनेजर.प्रोसेस इनपुट का उपयोग करें दूसरी विंडो में संसाधित किया गया जैसे कि यह अक्षम नहीं था। डिफ़ॉल्ट रूप से सभी वस्तुओं अब
<Setter Property="IsEnabled" Value="{Binding NonModal, Source={x:Static local:ModalModeTracker.Instance}}" />
:
बाध्यकारी
डेटा का उपयोग कर पर विवरण आप इस प्रकार का स्थिर मूल्य के लिए बटन, MenuItems, आदि के IsEnabled संपत्ति बाध्य करने के लिए एक शैलियों का उपयोग कर सकते हैं जब आपकी गैर-वाणिज्यिक संपत्ति झूठी हो जाती है तो इन शैलियों को स्वचालित रूप से अक्षम कर दिया जाएगा। हालांकि आपके मोडल मोड में भी सक्षम रहने के लिए कोई भी व्यक्तिगत नियंत्रण IsEnabled="true"
के साथ ओवरराइड कर सकता है। मल्टीबाइंडिंग और ईडीएफ अभिव्यक्ति के साथ अधिक जटिल बाइंडिंग किए जा सकते हैं जो भी आप चाहते हैं नियम निर्धारित करने के लिए बाध्यकारी।
इनमें से कोई भी दृष्टिकोण आपके दृश्य इंटरफ़ेस के माध्यम से पुनरावृत्ति की आवश्यकता नहीं है, कार्यक्षमता को सक्षम और अक्षम करता है। इनमें से कौन सा आप वास्तव में चुनते हैं वह यह है कि आप वास्तव में मोडल मोड के दौरान कौन सी कार्यक्षमता प्रदान करना चाहते हैं, और आपका शेष यूआई कैसे डिज़ाइन किया गया है।
किसी भी मामले में, डब्ल्यूपीएफ WinForms दिनों में यह इतना आसान बनाता है। क्या आपको सिर्फ डब्ल्यूपीएफ की शक्ति पसंद नहीं है?
मुझे लगता है कि आप सही रास्ते पर हैं। जब आप खिड़की खोले/बंद होते हैं, तो आप कोड-बैक में नियंत्रण को सक्षम/सक्षम कर सकते हैं, या आप अपने एक्सएएमएल में डेटाट्रिगर्स का उपयोग कर सकते हैं, नई विंडो खुली है या नहीं, इस पर आधारित विभिन्न नियंत्रणों के लिए 'IsEnabled' प्रॉपर्टी सेट कर सकते हैं। –