2010-03-06 4 views
5

यदि आप इस कोड स्निपेट को चलाने को बिल्कुल नया WinForm अनुप्रयोग में 2 रूपोंइसे "form.ShowDialog()" के लिए "this.ShowInTaskBar" को कैसे खोलें, इसे खोलते समय?

private void Form1_Load(object sender, EventArgs e) 
    { 
     Form2 newForm = new Form2(); 
     Button b = new Button(); 
     newForm.Controls.Add(b); 
     b.Click += new EventHandler(click); 
     this.Show(); 
     newForm.ShowDialog(); 

    } 

    private void click(object sender, EventArgs e) 
    { 
     ((Form)((Control)sender).Parent).ShowInTaskbar = false; 
    } 

साथ (यह Form1 में डाल) और आप नए रूप पर बटन पर क्लिक करें (Form2 होना चाहिए), Form2 बंद हो जाएगा ।

इसे कैसे खोलें?

उत्तर

0

कैसे ... मेरा ...इस एक बदसूरत हैक है

इस काम

private void Form1_Load(object sender, EventArgs e) 
    { 
     Form2 newForm = new Form2(); 
     Button b = new Button(); 
     newForm.Controls.Add(b); 
     b.Click += new EventHandler(click); 
     newForm.FormClosed += new FormClosedEventHandler(form2_closed); 
     newForm.FormClosing += new FormClosingEventHandler(form2_closing); 
     this.Show(); 
     do 
     { 
      newForm.ShowDialog(); 
     } while (newForm.IsDisposed == false);    
    } 

    private void click(object sender, EventArgs e) 
    { 
     ((Form)((Control)sender).Parent).ShowInTaskbar = !((Form)((Control)sender).Parent).ShowInTaskbar; 
    } 

    private void form2_closed(object sender, FormClosedEventArgs e) 
    { 
     ((Form)sender).Dispose(); 
    } 

    private void form2_closing(object sender, FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.None) 
      e.Cancel = true; 
    } 
+0

नहीं, यह सिर्फ गलत है। मोडल फॉर्म और टास्कबार आइकन मिश्रण नहीं करते हैं। एक या दूसरे का प्रयोग करें, लेकिन दोनों नहीं। –

+0

मैं आपसे सहमत हूं लेकिन मैं विनिर्देश नहीं बनाता, मेरी इच्छा है कि मैं कभी-कभी – Fredou

+0

समस्या न केवल आप सम्मेलन का उल्लंघन कर रहे हैं, यह भी है कि आप अपरिभाषित या छोटी गाड़ी व्यवहार पर भरोसा कर रहे हैं। आप पाते हैं कि यह विंडोज के सभी संस्करणों पर काम नहीं करेगा, उदाहरण के लिए। – overslacked

0

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

यदि आप ऐसे तरीके से और रूप दिखाना चाहते हैं जो उपयोगकर्ता को दोनों के साथ काम करने की अनुमति देता है, तो आपको मॉडलस संवाद का उपयोग करने की आवश्यकता होगी। यहां एक good overview article on MSDN है।

+0

मेरे सवाल, कैसे एक रूप है कि संवाद के रूप में दिखाया गया है और होना तय है रखने के लिए प्रपत्र स्वत: बंद करने – Fredou

2

आप ShowDialog() से पहले झूठ में ShowInTaskbar सेट करके इसे खोलते रहें;

private void Form1_Load(object sender, EventArgs e) 
{ 
    Form2 newForm = new Form2(); 
    Button b = new Button(); 
    newForm.Controls.Add(b); 
    b.Click += new EventHandler(click); 
    this.Show(); 

    // add this line of code... 
    newForm.ShowInTaskbar = false; 

    newForm.ShowDialog(); 

} 

private void click(object sender, EventArgs e) 
{ 
    ((Form)((Control)sender).Parent).ShowInTaskbar = false; 
} 

या बस दूसरा फॉर्म मोडल न बनाएं। यह भी काम करता है।

private void Form1_Load(object sender, EventArgs e) 
{ 
    Form2 newForm = new Form2(); 
    Button b = new Button(); 
    newForm.Controls.Add(b); 
    b.Click += new EventHandler(click); 
    this.Show(); 

    newForm.Show(); 
} 

मैं विशिष्ट तंत्र यहाँ पता नहीं है, लेकिन स्पष्ट रूप से क्या हो रहा है कि झंडा (जो वास्तव में एक या अधिक WS_EX_xxx खिड़की शैलियों में परिवर्तन) को बदलने ShowDialog() की मोडल पंप बाहर निकलने के लिए पैदा कर रहा है। यह बदले में आपको (अंततः!) फॉर्म 1_लोड से बाहर निकलने का कारण बन रहा है और फिर आपका नयाफॉर्म गुंजाइश से बाहर हो गया है और नष्ट हो गया है।

तो आपकी समस्या ShowDialog() की एक संगतता है और तथ्य यह है कि आप शोडिअलॉग() के लिए बाहर निकलने के लिए तैयार नहीं हैं।

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

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

+0

यह था बिना कार्य पट्टी से हटाने है एक उदाहरण, उपयोगकर्ता फॉर्म 2 के अंदर मेनू से उस चर की स्थिति बदल सकता है, यह स्वचालित सेटिंग नहीं है – Fredou

+0

@Fredu: अच्छी तरह से आपकी समस्या है। खिड़की पहले से ही बनाई गई थी के बाद इस लाइव को बदलने का कोई मतलब नहीं है। किसी भी मामले में, यदि दूसरा फॉर्म मोडल नहीं था, तो जब आप फ्लैग –

+0

बदलते हैं तो बदले में काम नहीं करेंगे, मैं बदसूरत कामकाज के लिए अपने उत्तर को देखता हूं, मैं विनिर्देश नहीं बनाता, मैं उन्हें लागू करता हूं :-( – Fredou

4

यह संभव नहीं है। मैंने वास्तव में माइक्रोसॉफ्ट की प्रतिक्रिया साइट पर इसके बारे में bug report दायर किया लेकिन उन्होंने मुझे उस पर पक्षी फिसल दिया।

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

विंडोज फॉर्म कई उपयोगकर्ता 32 सीमाओं के आसपास काम करता है। लेकिन वह नहीं।

+0

मुझे एक बदसूरत कामकाज मिला, मेरा खुद का जवाब – Fredou

+0

@Fredou: आप बिल्कुल सही हैं, यह मां को बदसूरत है। लेकिन इसके साथ आने के लिए kudos। फिर भी, सामान्य यूआई दिशानिर्देशों का पालन करने का प्रयास करें, संवाद में उनके ShowInTaskbar प्रॉपर्टी सेट नहीं होना चाहिए। –

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