سؤال

تحرير 2

حسنًا، بناءً على النصائح الواردة في الإجابات أدناه، قمت بإلغاء أسلوب الخيط الخاص بي والآن يبدو برنامجي كما يلي:Program.cs

 static void Main(){

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

FrmWWCShell FrmWWCShell = null;
var splash = new FrmSplash();
splash.SplashFormInitialized += delegate
                                {
                                    FrmWWCShell = new FrmWWCShell();
                                    splash.Close();
                                };
Application.Run(splash);
Application.Run(FrmWWCShell);

}

و FrmSplash.cs مثله:

public partial class FrmSplash : Form
{

    public FrmSplash()
    {
        InitializeComponent();
    }

    protected override void  OnLoad(EventArgs e)
    {
        splashTimer.Interval = 1;
        splashTimer.Tick +=
            delegate { if (SplashFormInitialized != null) SplashFormInitialized(this, EventArgs.Empty); };
        splashTimer.Enabled = true;
    }

    public event EventHandler SplashFormInitialized;
}

المشكلة هي أنها لا تعمل على الإطلاق الآن.تنبثق شاشة البداية لجزء من الثانية، ولا تتم تهيئة شريط التقدم مطلقًا، ثم يختفي بينما أنتظر 10 ثوانٍ حتى يظهر ملف dll والنموذج الرئيسي بينما لا أحدق في أي شيء....

لون لي مرتبك بشدة الآن!


المنشور الأصلي--> للرجوع إليه

لقد قمت بتطبيق شاشة Splash تحميل التطبيق تعمل على مؤشر ترابط منفصل بينما يتم تحميل جميع DLL ويتم "رسم". هذا يعمل كما هو متوقع.الغريب أنه الآن عندما يخرج نموذج Splash، فإنه يرسل النموذج الرئيسي الخاص بي إلى الخلف، إذا كان هناك أي شيء آخر مفتوح (أي.الآفاق).أبدأ الموضوع في Program.cs،

static class Program
{
    public static Thread splashThread;

    [STAThread]
    static void Main()
    {
        splashThread = new Thread(doSplash);
        splashThread.Start();

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FrmWWCShell());
    }

    private static void doSplash()
    {
        var splashForm = new FrmSplash();
        splashForm.ShowDialog();
    }
}

ثم أقوم بإنهائه بمجرد إطلاق حدث FrmSearch_Shown الخاص بي.

private void FrmSearch_Shown(object sender, EventArgs e)
    {
        Program.splashThread.Abort();
        this.Show();
        this.BringToFront();
    }

لقد حاولت، كما ترى، الاتصال بـ Show() و/أو BringToFront() على FrmSearch ولا يزال الأمر "يقفز" للخلف.

ماذا ينقصني؟
ماذا يمكنني أن أحاول؟
هل أفعل هذا جاهلًا جدًا لدرجة أن عمليتي هي التي تسبب هذا؟
هل يجب أن أتقدم بطلب للتقاعد المبكر؟

شكرا على أي فكرة!


تحرير 1

لقد حاولت تعيين خاصية TopMost في النموذج الرئيسي الخاص بي على حقيقي.يؤدي هذا إلى منع النموذج الخاص بي من الاختباء ولكنه يمنع المستخدم أيضًا من النظر إلى أي تطبيق آخر.يبدو أني نرجسية بعض الشيء..

هل كانت مفيدة؟

المحلول

أولاً، من المهم جدًا أن يتم تنفيذ عمل واجهة المستخدم على مؤشر ترابط التطبيق الأساسي.أنا في الواقع مندهش نوعًا ما أنك لا تحصل على أخطاء أكثر خطورة بالفعل من خلال عرض شاشة البداية على سلسلة محادثات في الخلفية.

إليك التقنية التي استخدمتها:

استخدم Application.Run على نموذج البداية الخاص بك بدلاً من النموذج "الحقيقي".

في نموذج البداية الخاص بك، قم بتهيئة حدث:

public event EventHandler SplashFormInitialized

أنشئ مؤقتًا يتم تشغيله خلال ميلي ثانية واحدة، ويقوم بتشغيل هذا الحدث.

بعد ذلك، في طريقة تشغيل التطبيق، يمكنك تحميل النموذج الحقيقي الخاص بك، ثم إغلاق نموذج البداية الخاص بك وإجراء تطبيق. تشغيل على النموذج الحقيقي

var realForm = null;

var splash = new SplashForm();
splash.SplashFormInitialized += delegate {
  // As long as you use a system.windows.forms.Timer in the splash form, this
  // handler will be called on the UI thread
  realForm = new FrmWWCShell();
  //do any other init
  splash.Close();
}
Application.Run(splash); //will block until the splash form is closed

Application.Run(realForm);

قد تشمل البداية ما يلي:

overrides OnLoad(...)
{
   /* Using a timer will let the splash screen load and display itself before
      calling this handler
   */
   timer.Interval = 1;
   timer.Tick += delegate {
     if (SplashFormInitialized != null) SplashFormInitialized(this, EventArgs.Empty);
   };
   timer.Enabled = true; 
}

نصائح أخرى

حاول الاتصال بـ Application.DoEvents() مباشرة بعد العرض.

تحذير:لا تتصل بـ DoEvents كثيرًا، ولكن هذا هو أحد تلك الأوقات.

يحرر:لاحظ كلايد شيئًا لم ألاحظه:أنت خيوط هذا.لا تقم بتشغيل أي واجهة مستخدم على موضوع آخر.أخرج الخيط واتركه في Application.DoEvents().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top