2009-09-15 16 views
7

मैं नहीं चाहता कि उपयोगकर्ता मेरे आवेदन के साथ बातचीत करे, जबकि एक निश्चित पृष्ठभूमि कार्यकर्ता व्यस्त है (काम कर रहा है)। मैंने यह बीजीडब्ल्यू बनाया है ताकि जब यह काम कर रहा हो तो एप्लिकेशन जमे हुए नहीं दिखता है। लेकिन अब उपयोगकर्ता ऐप में घूम सकते हैं। मैं अपना फॉर्म/एप्लिकेशन कैसे अक्षम करूं?पृष्ठभूमि वर्कर व्यस्त होने पर फ़ॉर्म अक्षम करें?

धन्यवाद!

+1

यदि आप पृष्ठभूमि में कोड लेते समय फ़ॉर्म को अक्षम करने जा रहे हैं तो इसे पृष्ठभूमि में ले जाने का क्या मतलब है? – JaredPar

+0

क्योंकि पृष्ठभूमिवर्कर के बिना विंडोज़ कहेंगे कि यदि उपयोगकर्ता इसके साथ बातचीत करने का प्रयास करता है तो एप्लिकेशन "प्रतिक्रिया नहीं दे रहा है"। – Chris

उत्तर

14

शायद Enabled से false पर सेट करें?

this.Enabled = false; 

हालांकि यह थोड़ा कठोर है, क्योंकि यह फ़ॉर्म को स्थानांतरित, आकार बदलने या ईवेंट बंद होने से रोकता है। एक बेहतर तरीका Panel आपके फॉर्म में नियंत्रण रखना होगा, जिसमें Dock = Fill है, और हमारे अन्य नियंत्रण Panel में रखें। फिर आप आगे उपयोगकर्ता इनपुट को रोकने के लिए Panel की Enabled संपत्ति का उपयोग कर सकते हैं।

नोट ने सोचा कि उपयोगकर्ता फ़ॉर्म को बंद करने में सक्षम हो जाएगा, ताकि इसे किसी भी तरह से गहन तरीके से संभाला जाना चाहिए।

+1

यह करने के लिए यह एक त्वरित और गंदा तरीका है, लेकिन यह उस फ़ॉर्म पर हर नियंत्रण को अक्षम करने से बेहतर हो सकता है (उपयोगकर्ता आपकी स्थिति के आधार पर) उपयोगकर्ता द्वारा बातचीत कर सकते हैं। –

+0

@ माइकल: फ़ॉर्म को अक्षम करना वास्तव में तेज़ और गंदा है: ओ) –

+0

धन्यवाद, मैंने माइकल के सुझाव के समान कुछ किया। – Chris

0

एक और संभावित तरीका यह हो सकता है कि आप एप्लिकेशन में सभी इनपुट "फ़िल्टर करें"। यह "कीडाउन" और "माउसबटनडाउन" को सुनकर किया जा सकता है। पृष्ठभूमि नौकरी ट्रिगर होने के बाद आप FILTER_INPUT ध्वज को सत्य पर सेट कर सकते हैं और इसे एक बार पूरा कर सकते हैं। यदि FILTER_INPUT ध्वज सेट किया गया है तो सभी कुंजी और माउस ईवेंट रद्द कर सकते हैं।

यह सबसे प्रभावी नहीं हो सकता है क्योंकि सभी कीप्रेस और क्लिक फ़िल्टर फ़िल्टर को आगे बढ़ने जा रहे हैं।

1

मैं उपरोक्त अपनी टिप्पणी में @ माइकल-टॉड से सहमत हूं, व्यक्तिगत नियंत्रण/नेविगेशन बटन/आदि अक्षम कर रहा हूं। जबकि पृष्ठभूमि कार्यकर्ता काम कर रहा है एक काफी अच्छा समाधान की तरह लगता है। यह विशिष्ट पृष्ठभूमि संचालन के दौरान उपयोगकर्ता क्या कर सकता है इस पर आपको बढ़िया नियंत्रण प्रदान करेगा।

आप किए जा सकेंगे:

  1. बनाएं को सक्रिय या निष्क्रिय करने के लिए सभी उचित नेविगेशन/इंटरेक्शन नियंत्रण
  2. कॉल (प्रत्येक नियंत्रण के लिए उपयुक्त के रूप में सही/गलत, आदि के लिए अपने सक्रिय संपत्ति की स्थापना द्वारा) "तरीकों अक्षम "अपने कोड से विधि सही इससे पहले कि आप अपनी पृष्ठभूमि के कार्यकर्ता
  3. RunWorkerCompleted के लिए ईवेंट हैंडलर में पर StartWorkerAsync() कहते हैं, कहते हैं" उपयोगकर्ता इनपुट के लिए दृश्य को फिर से सक्षम करने के लिए सक्षम "विधि
4

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

+0

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

+1

मैंने जो कुछ किया है, वह है कि पैनल में निहित फॉर्म में सब कुछ है, फिर पैनल को छुपाएं और "व्यस्त" संदेश डालें। इस तरह अंतर्निहित नियंत्रणों से बातचीत करने का कोई तरीका नहीं है। –

1

यह कुछ नियंत्रण अक्षम करने का प्रबंधन करने के लिए आसान उन्हें एक पैनल के अंदर रखने और है कि पैनल को अक्षम करने के बजाय अक्षम करने व्यक्तिगत नियंत्रण से है:

controlPanel.Enabled = false; 

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

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

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

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