2012-06-05 24 views
8

का उपयोग Winforms, एक पृष्ठभूमि धागे पर Form.ShowDialog का उपयोग कर अगर मैं एक धागा है कि "मुख्य" ui धागा नहीं है मैं safetlyएक प्रपत्र बनाना और

  1. एक फ़ॉर्म बना सकते पर हूँ,
  2. उस प्रपत्र पर
  3. कॉल ShowDialog

ऐसा लगता है कि मैं के नियम का पालन किया जाएगा लगता है:। Winforms नियंत्रण धागा वे में बनाया गया पर संशोधित किया जाना चाहिए

मैंने जो कुछ पढ़ा है, उससे ऐसा लगता है कि शोडियलोग अपना संदेश पंप बनाएगा ताकि मुझे उस थ्रेड पर बनाए गए फॉर्म के बारे में चिंता करने की आवश्यकता न हो, जिसमें पहले से ही एक संदेश पंप है।

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

+0

+1 यह एक अच्छा सवाल था। –

उत्तर

7

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

इन्हें ठीक करने में कठिनाई होती है, वे आपके ऐप को फ्लैकी बनाते हैं। किसी भी संदर्भ का संदर्भ न देने का कोई अच्छा कारण नहीं है, आप इसे कक्षा में कुछ तरीके से कैसे पास कर सकते हैं। यदि आपको वास्तव में आवश्यक हो, तो आपको हमेशा आवेदन मिल गया है। ओपनफॉर्म [0] वापस गिरने के लिए।

+0

धन्यवाद हंस। एप्लिकेशन का उपयोग करने के लिए कोई भी नीचे पक्ष। ओपनफॉर्म [0]? क्या यह हमेशा मौजूद होने की गारंटी है? –

+1

@ मैटस्मिथ: यह होना चाहिए, हां, लेकिन मुझे यह [एसओ पोस्ट] मिला है (http://stackoverflow.com/questions/3751554/application-openforms-count-0-always) एक बग का विवरण, सुनिश्चित नहीं है कि अभी भी मौजूद है। –

+1

हालांकि यह अभी भी मौजूद है, बचने में आसान है। –

2

हां, आप यह कर सकते हैं, लेकिन यदि आप चाहते हैं कि संवाद वास्तव में एक मोडल संवाद की तरह कार्य करे (यानी, मूल विंडो को अवरुद्ध करें, जिसे मैं मानता हूं कि आप ShowDialog पर कॉल कर रहे हैं) तो निराश होने के लिए तैयार रहें।

आप वास्तव में यहां हल करने की कोशिश कर रहे हैं। ऐसा लगता है जैसे आप एक मॉडल संवाद चाहते हैं जो ब्लॉक नहीं करता है, जो थोड़ा अजीब है। यदि आप हाथ में समस्या की व्याख्या करते हैं तो ऐसे समाधान का अस्तित्व हो सकता है जिसे आपने अभी तक नहीं माना है।

+0

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

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