2009-05-03 23 views
34

मैंने सुना है कि अगर मैं स्वामी को निर्दिष्ट किए बिना फॉर्म .ShowDialog() को कॉल करता हूं, तो एक ऐसा मामला हो सकता है जब मुझे स्क्रीन पर संवाद फ़ॉर्म नहीं दिखाई देगा (यह अन्य विंडोज़ के साथ छिपा होगा)। क्या यह सच है? मैंने शोडियलॉग() का इस्तेमाल सैकड़ों बार मालिक को निर्दिष्ट किए बिना किया था और मुझे इसके साथ कोई समस्या नहीं थी।फॉर्म। शोडियलॉग() या फॉर्म। शोडियलॉग (यह)?

क्या आप कृपया बता सकते हैं कि किस स्थिति में मुझे वर्णित समस्या मिल सकती है?

अद्यतन:

ठीक है, मैं कई प्रयोग किया था और मैं ShowDialog उपयोग करने के साथ किसी भी असली अप्रत्याशित समस्याओं() (मालिक निर्दिष्ट किए बिना) नहीं मिल सका।

तो मुझे लगता है कि यह सिर्फ अफवाहें है कि ShowDialog() समस्याओं का कारण बन सकती है। यदि आप सहमत नहीं हैं - मुझे एक कोड नमूना दें जो कृपया एक समस्या का कारण बनता है।

+4

यह Winforms में लागू नहीं होता है, लेकिन रिकॉर्ड के लिए, मैं यहां आया क्योंकि मुझे WPF में समस्याएं थीं। अगर मैं किसी अन्य एप्लिकेशन पर स्विच करता हूं, जब मैंने पैरेंट फॉर्म पर दोबारा क्लिक किया, तो बच्चा संवाद पीछे फंस गया (बमर को बाल संवाद में टास्कबार में दिखाने के लिए सेट नहीं किया गया था)। संवाद के मालिक को सेट करने से इस समस्या को ठीक किया गया। – Benjol

+4

पृष्ठभूमि कार्यकर्ता प्रारंभ करें और ShowDialog पर कॉल करें।खिड़की आपके आवेदन के सामने दिखाई नहीं देगी लेकिन पृष्ठभूमि पर (केवल हमें प्रोग्रामर परेशान करने के लिए यह केवल हर समय होता है)। – CodingBarfield

+0

Barfieldmv, मैंने आपके द्वारा सुझाए गए कार्यों को करने की कोशिश की और यह फ़ॉर्म पृष्ठभूमि पर नहीं, शीर्ष पर दिखाई देता है। – nightcoder

उत्तर

6

बस बेहतर मालिक के स्वामित्व वाली संबंध को समझना:

नेट "स्वयं" अन्य रूपों के लिए एक फार्म की अनुमति देता है। स्वामित्व वाले फॉर्म फ़्लोटिंग टूलबॉक्स और कमांड विंडो के लिए उपयोगी हैं। स्वामित्व वाले फॉर्म का एक उदाहरण माइक्रोसॉफ्ट वर्ड में विंडो ढूंढें और बदलें। जब कोई मालिक विंडो कम हो जाती है, तो स्वामित्व वाले फॉर्म भी स्वचालित रूप से कम हो जाते हैं। जब स्वामित्व वाला फॉर्म अपने मालिक को ओवरलैप करता है, तो यह हमेशा शीर्ष पर प्रदर्शित होता है।

(सी) मैथ्यू मैकडॉनल्ड्स द्वारा "प्रो .NET 2.0 विंडोज फॉर्म और कस्टम कंट्रोल"।


के रूप में ShowDialog नए रूप से पता चलता है, एक अंतर्निहित संबंध वर्तमान में सक्रिय रूप है, मालिक फार्म के रूप में जाना जाता है, और नया रूप, के स्वामित्व वाले प्रपत्र के रूप में जाना के बीच स्थापित है। यह संबंध सुनिश्चित करता है कि स्वामित्व वाला फॉर्म सक्रिय रूप है और हमेशा मालिक फ़ॉर्म के शीर्ष पर दिखाया गया है। इस रिश्ते के

एक विशेषता यह है कि स्वामित्व प्रपत्र (जब ShowDialog का प्रयोग करके) अपने मालिक फार्म के व्यवहार को प्रभावित करता है:

  • मालिक रूप है, कम से कम नहीं किया जा सकता को बड़ा किया, या यहाँ तक ले जाया गया।
  • स्वामित्व वाला फॉर्म स्वामी के रूप में माउस और कीबोर्ड इनपुट ब्लॉक करता है।
  • स्वामित्व वाला फॉर्म होने पर मालिक का फॉर्म कम हो जाता है।
  • केवल स्वामित्व वाला फॉर्म बंद किया जा सकता है।
  • यदि दोनों मालिक और स्वामित्व वाले फॉर्म कम किए गए हैं और यदि उपयोगकर्ता स्वामित्व वाले फॉर्म पर स्विच करने के लिए Alt + Tab दबाता है, तो स्वामित्व वाला फॉर्म सक्रिय होता है।

ShowDialog विधि विपरीत, तथापि, के लिए एक कॉल विधि करता है एक अंतर्निहित मालिक के स्वामित्व वाली संबंध स्थापित नहीं कर दिखाएं। इसका मतलब है कि या तो फॉर्म वर्तमान में सक्रिय रूप हो सकता है।

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

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

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

(सी) क्रिस सेल्स, माइकल वेनहार्ट द्वारा "विंडोज फॉर्म 2.0 प्रोग्रामिंग"।

+0

लाइफ सेवर, अब मैं कर सकता हूं जो मुझे चाहिए – Takarii

+0

अद्भुत विस्तृत उत्तर! –

5

पैरामीटर रहित ShowDialog() बस "डिफ़ॉल्ट" अभिभावक का उपयोग करता है। इसके लायक होने के लिए, डिफ़ॉल्ट माता-पिता जो भी "वर्तमान में सक्रिय विंडो" है। जब आप माता-पिता की देखभाल करते हैं, तो आपको इसे स्पष्ट रूप से सेट करने की आवश्यकता होती है।

+0

धन्यवाद, लेकिन मुझे पता है कि ShowDialog() वर्तमान में सक्रिय विंडो का उपयोग करता है, मुझे नहीं पता कि यह स्थिति कैसे हो सकती है कि संवाद उस तरीके से दिखाई देगा जिस तरह से उपयोगकर्ता इसे देख पाएगा। – nightcoder

7

"वर्तमान में सक्रिय विंडो" आमतौर पर अग्रभूमि विंडो को संदर्भित करती है, लेकिन केवल तभी जब यह वर्तमान धागे से संबंधित है - एमएसडीएन में GetActiveWindow देखें।

(वास्तविक जानकारी समुदाय की सामग्री में है, लेकिन टिप्पणीकर्ता सही है कि "प्रति-थ्रेड सक्रिय विंडो", AFAIK नहीं है)।

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

इसके अलावा, यदि कोई अन्य एप्लिकेशन वर्तमान में सक्रिय है, तो आपका संवाद शीर्ष पर नहीं दिखाया जाएगा, लेकिन यह किसी अन्य विंडो के पीछे छिपा होगा।

मामूली परेशानी के रूप में, प्रारंभिक स्थिति आमतौर पर गलत या भ्रामक होती है।

व्यावहारिक रूप से, यह शायद ही कभी होता है, हालांकि: यदि आप मेनू या बटन के जवाब में संवाद खोलते हैं तो अपनी मुख्य विंडो पर क्लिक करें, उपयोगकर्ता वास्तव में किसी अन्य विंडो पर स्विच करने का प्रबंधन नहीं करेगा।

हालांकि, यह तकनीकी रूप से संभव है, और काफी होने की संभावना है अगर आप कुछ स्वचालन, बाहरी संदेश आदि

+5

सामान्य नियम के रूप में, यदि माता-पिता को निर्दिष्ट करना संभव है, तो माता-पिता को निर्दिष्ट किया जाना चाहिए। यह कभी दर्द नहीं होता है, और यह अक्सर मदद करता है। –

+0

मुझे वास्तव में यह समस्या है - मैं एक दृष्टिकोण प्लगइन से बाहरी प्रक्रिया चला रहा हूं - और यह संवाद नहीं दिखाता है। कोई विचार कैसे संवाद दिखाने के लिए? इसमें कोई फॉर्म नहीं है -> मैं बस एक संवाद दिखाना चाहता हूं। अगर मैं पहले "MessageBox.Show" कहता हूं - यह काम करता है - अन्यथा नहीं। – bernhardrusch

+0

@bernhardrusch: क्या आपने माता-पिता के रूप में GetDesktopWindow के .NET समकक्ष को निर्दिष्ट करने का प्रयास किया था? – peterchen

20

एक झुंझलाहट मैं ShowDialog() ShowDialog बनाम (यह) के साथ पाया के जवाब में संवाद खोलने के।

टेस्ट ऐप चलाएं, नया प्रारूप दिखाएं .ShowDialog(), अपने टास्कबार पर "डेस्कटॉप दिखाएं" पर क्लिक करें या त्वरित लॉन्च टूलबार पर क्लिक करें, टास्कबार पर TestApp पर क्लिक करें। यह मेनफॉर्म दिखाता है। अपने नए प्रारूप में जाने के लिए आपको Alt-Tab करना होगा।

वी.एस.

भागो TestApp,, newform.ShowDialog (यह) दिखाने के लिए, क्लिक करें आपके टास्कबार या त्वरित लॉन्च उपकरण पट्टी पर "शो डेस्कटॉप" टास्कबार पर TestApp पर क्लिक करें। यह शीर्ष पर नया प्रारूप दिखाता है।

+0

मुझे आपके द्वारा वर्णित समस्या का सटीक सटीक होना है। लेकिन मैंने ShowDialog() को ShowDialog (यह) में बदल दिया है और इससे मदद नहीं मिली है। – Colin

1

हां, इससे कुछ मामलों में अंतर आता है।मुझे अब तक पैरामीटर रहित विधि के साथ कोई समस्या नहीं थी, और मुझे आश्चर्य हुआ कि मूल रूप डिफ़ॉल्ट रूप नहीं था। इसलिए, अप्रत्याशित व्यवहार से बचने के लिए, हमेशा असली मूल रूप से ShowDialog विधि को पास करें।

1

निम्न उदाहरण लें:

आपका मुख्य रूप में, आप एक ListView है, लेबल संपादन के साथ सक्षम होना चाहिए। जब कोई विशिष्ट लेबल संपादित किया जाता है, तो आप दूसरी विंडो लॉन्च करते हैं, (में ShowDialog() का उपयोग करके)। नया फॉर्म टास्क बार में नहीं दिखता है।

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

कॉलिंग ShowDialog(this) इस समस्या को हल करता है।

0

मुझे यह समस्या थी, और इसे हल करने के लिए विंडोज़ राज्य की संपत्ति को सामान्य में बदल दिया, क्योंकि शायद यह कम हो गया।

0

मुझे अभी एक ऐसा मामला मिला है जहां this का उपयोग कर मालिक को निर्दिष्ट नहीं किया गया है।

लॉन्च करने पर मेरा एप्लिकेशन स्वयं को पूर्णस्क्रीन जाने के लिए मजबूर करता है और यह भी सुनिश्चित करता है कि यह हमेशा ध्यान केंद्रित करता है, भले ही उपयोगकर्ता इसे Alt + Tab से बाहर करने का प्रयास करता हो, भले ही आप व्यवस्थापक या डेवलपर के रूप में लॉग इन न करें।

जब मैं एक कस्टम पर ShowDialog() का उपयोग के रूप में संवाद बॉक्स प्रकट होता के पीछे कुछ कारण के लिए अपने आवेदन, और क्योंकि संवाद बॉक्स वर्तमान में सक्रिय है आवेदन ही निष्क्रिय हो जाता है। अगर मैं ShowDialog(this) का उपयोग करता हूं तो फॉर्म इरादे के रूप में दिखाई देता है।

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