2009-02-04 15 views
8

छुपा नहीं मैं एक WinForms आवेदन जिसमें मैं 2 फार्म का उपयोग कर रहा है सभी आवश्यक नियंत्रण दिखाना है।सी # WinForms स्टार्टअप (स्पलैश) प्रपत्र

Application.Run(new SplashForm()); 

आवेदन लोड हो रहा है पूरा कर लिया है एक बार मैं SplashForm चाहते छिपाने के लिए या मुझे भेजे गए हैं: पहला पर्चा एक स्प्लैश स्क्रीन जिसमें यह उपयोगकर्ता है कि यह आदि लोड हो रहा है यह तो मैं निम्नलिखित कोड का उपयोग कर रहा है बताता है पीछे और मुख्य दिखाने के लिए। मैं वर्तमान में उपयोग कर रहा हूँ निम्नलिखित:

private void showMainForm() 
{ 
    this.Hide(); 
    this.SendToBack(); 

    // Show the GUI 
    mainForm.Show(); 
    mainForm.BringToFront(); 
} 

क्या मैं देख रहा हूँ कि MainForm दिखाया गया है है, लेकिन अभी भी SplashForm 'शीर्ष पर' दिख रहा है। मैं वर्तमान में जो कर रहा हूं वह मैनफॉर्म पर मैन्युअल रूप से इसे सामने लाने के लिए क्लिक कर रहा है। यह क्यों हो रहा है पर कोई विचार?

उत्तर

20

शायद तुम सिर्फ छप प्रपत्र बंद करने के लिए, और इसे वापस करने के लिए नहीं भेज चाहते हैं।

मैं एक अलग थ्रेड पर छप रूप से चलाने के (इस वर्ग SplashForm है):

class SplashForm 
{ 
    //Delegate for cross thread call to close 
    private delegate void CloseDelegate(); 

    //The type of form to be displayed as the splash screen. 
    private static SplashForm splashForm; 

    static public void ShowSplashScreen() 
    { 
     // Make sure it is only launched once. 

     if (splashForm != null) 
      return; 
     Thread thread = new Thread(new ThreadStart(SplashForm.ShowForm)); 
     thread.IsBackground = true; 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start();   
    } 

    static private void ShowForm() 
    { 
     splashForm = new SplashForm(); 
     Application.Run(splashForm); 
    } 

    static public void CloseForm() 
    { 
     splashForm.Invoke(new CloseDelegate(SplashForm.CloseFormInternal)); 
    } 

    static private void CloseFormInternal() 
    { 
     splashForm.Close(); 
    } 
... 
} 

और मुख्य कार्यक्रम समारोह इस तरह दिखता है:

[STAThread] 
static void Main(string[] args) 
{ 
    SplashForm.ShowSplashScreen(); 
    MainForm mainForm = new MainForm(); //this takes ages 
    SplashForm.CloseForm(); 
    Application.Run(mainForm); 
} 
+0

इस विधि यदि SplashForm, एक WPF विंडो – MrEdmundo

+1

मैं इसे केवल WinForms के लिए उपयोग है खेद काम नहीं करता। – Grzenio

+0

मैंने आपकी कक्षा में "frmSplash splashForm" जैसे चर को परिभाषित किया है, लेकिन मुझे परिभाषित चर के लिए "गैर-स्थैतिक फ़ील्ड, विधि या संपत्ति के लिए एक ऑब्जेक्ट संदर्भ आवश्यक है" जैसी कुछ त्रुटियां मिलती हैं। मैं आपकी कक्षा से कैसे उपयोग कर सकता हूं? – Sadegh

2

मैं सही ढंग से समझ लिया है, तो आप केवल आवेदन का उपयोग करना चाहिए। अपने मुख्य रूप पर रुन। तो या तो बस की तरह कुछ का उपयोग करके पहले अपने छप दिखाने:

using(MySplash form = new MySplash()) 
    form.ShowDialog(); 

और फिर मैन्युअल रूप से इसे बंद MySplash में जब भी आप करना चाहते हैं।

या अपने मुख्य रूपों लोड ईवेंट हैंडलर में यह दिखाने के लिए और फिर इसे बंद या जो कुछ भी जब तक आप लोड विधि पूरा जाने के लिए प्रतीक्षा करें। (संभवतः गलत पर दृष्टिगोचर सेट करने से पहले आप इसे बाद में दिखाने के लिए और वापस सही करने के लिए।

1

मुझे विश्वास है कि यह मेरे वर्तमान डिजाइन में एक डिजाइन दोष हो सकता है!

मुझे लगता है कि प्राप्त करने के लिए सबसे अच्छा तरीका है कि मैं क्या जरूरत है । MainForm से नियंत्रित सब कुछ है तो मैं उपयोग कर सकते हैं:

Application.Run(new MainForm()); 

यह तो/दिखा/अद्यतन करने के लिए ज़िम्मेदार हो जाएगा SplashScreen छुपा इस तरह से मैं सिस्टम द्वारा प्रबंधित के बाकी के साथ आवश्यक जटिल intactions हो सकता है। MainForm।

4

यह आपका ध्यान चोरी और पृष्ठभूमि के लिए अपने मुख्य रूप धक्का यह बंद कर देता है के बाद से अपने स्प्लैश स्क्रीन को रोकने के लिए महत्वपूर्ण है:

protected override bool ShowWithoutActivation { 
    get { return true; } 
} 

आप को यह जोड़े प्रपत्र वर्ग छप।

+0

इस उपयोगी जानकारी को साझा करने के लिए धन्यवाद :) – hima