سؤال

لا تزال لدي مشكلة مع شاشة البداية.لا أريد استخدام العقار SC.TopMost=true.

الآن سيناريو التطبيق الخاص بي هو كما يلي:

في برنامج progeram.cs:

[STAThread]
static void Main()
{
    new SplashScreen(_tempAL);// where _tempAL is an arrayList
    Application.Run(new Form1(_tempAL));
}

في فئة SplashScreen:

public SplashScreen(ArrayList _Data)
{
    DisplaySplash()
} 
private void DisplaySplash()
{
    this.Show();
    this.TopMost = true;
    this.CenterToScreen();
    this.SetTopLevel(true);

    _allServerNarrators = new string[10];
    for (int i = 0; i < _allServerNarrators.Length; i++)
        _allServerNarrators[i] = null;

    GetFromServer();

    this.Hide();
    _serverData = new ArrayList();
    _thisData.Add(_allServerNarrators);
    _thisData.Add(_serverNarrators);

}
private void GetFromServer()
{
    _serverNarrators = new ArrayList();
    string _file = "Suras.serverNar";

    if (!Directory.Exists("c:\\ASGAQuraan"))
        Directory.CreateDirectory("c:\\ASGAQuraan");

    while (counter < 4 && _serverFiles == null)
    {
        if (Download("c:\\ASGAQuraan", _ftpServerIP, _file))
        {
            StreamReader _strReader = new StreamReader
                         ("c:\\ASGAQuraan\\"+_file,System.Text.Encoding.Default);
            string _line = _strReader.ReadLine();
            string _word;

            while (true)
            {
                while (_line != null)
                {
                    _word = _line.Substring(0, _line.IndexOf("*"));
                    int _narId = Convert.ToInt32(_word);
                    _line = _line.Substring(2);
                    int k = 0;
                    _serverNarratorNode = new ArrayList();
                    while (true)
                    {
                        int ind = _line.IndexOf("*");
                        if (ind > 0 && ind < _line.Length)
                        {
                            string str = _line.Substring(0, (ind));
                            if (k == 0)
                            {
                                _allServerNarrators[_narId] = str;
                                _serverNarratorNode.Add(str);
                            }
                            else
                            {
                                _serverNarratorNode.Add(str);
                            }
                            _line = _line.Substring(ind + 1);
                            k++;
                        }
                        else
                        {
                            _line = null;
                            break;
                        }
                    }
                    _serverNarrators.Add(_serverNarratorNode);
                    _serverFiles = "added";
                }
                _line = _strReader.ReadLine();
                if (_line == null)
                {
                    break;
                }
            }
        }
        else
            counter++;
    }
}

ما أريده هو شيء في فئة شاشة البداية ينتظر حتى انتهاء الخيط.

لمزيد من التفاصيل، من فضلك قل لي ما أريد أن أقول لك.

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

المحلول

فيما يلي المواضيع 2 مربكة بعض الشيء، لكنني سأخذ طعنة وأقول هذا ...

لا أفهم تصميمك بالكامل هنا، ولكن إذا كانت المشكلة هي أنه عند تشغيل تطبيق ثان، يتحول نموذج شاشة البداية إلى اللون الأبيض ... من المرجح أن تكون شاشة البداية مشغولة بتنفيذ كل هذا الرمز في GetFromserver (). مشغول جدا أنه ليس لديه وقت لإعادة الطلاء نفسه.

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

نصائح أخرى

نفس السؤال، نفس الإجابة:

يحتوي Worknet Framework على دعم ممتاز شاشات Splash. بدء مشروع WF جديد، مشروع + إضافة مرجع، حدد Microsoft.VisualBasic. إضافة نموذج جديد، اتصل به frmsplash. افتح Project.cs وجعلها تبدو وكأنها:

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;

namespace WindowsFormsApplication1 {
  static class Program {
    [STAThread]
    static void Main(string[] args) {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      new MyApp().Run(args);
    }
  }
  class MyApp : WindowsFormsApplicationBase {
    protected override void OnCreateSplashScreen() {
      this.SplashScreen = new frmSplash();
    }
    protected override void OnCreateMainForm() {
      // Do your time consuming stuff here...
      //...
      System.Threading.Thread.Sleep(3000);
      // Then create the main form, the splash screen will close automatically
      this.MainForm = new Form1();
    }
  }
}

لقد أدخلت أراضي خطرة عن طريق إنشاء واجهة المستخدم قبل مكالمتك إلى Application.Run (). Application.Run هو أساسا مضخة رسالة البرنامج الخاص بك. من خلال عرض واجهة المستخدم قبل بدء تشغيل مضخة رسالة التطبيق، فإنك تجعل تفاعل UI نموذجي مستحيل بفعالية في واجهة المستخدم السابقة لأوانه. بالنسبة لشاشة البداية، قد لا يبدو ذلك ذا صلة، لكنه سوف يهم إذا كان هناك طلب (على سبيل المثال) هناك طلب لجعل شاشة البداية تختفي إذا تم النقر فوقه، أو تريد استخدام محمل معلومات أساسية.

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

أنا أشجع بقوة إجابة نوبود في هذه الحالة. يوفر الإطار الدعم الذي تحتاجه. في حين أن ميزات مساحة الاسم Microsoft.Visualbasic ليست دائما قابلة لللاكماينة للغاية للمبرمجين C #، فيمكنهم أن تكون مهلة حقيقية وحيوية للحالات مثل هذا.

حظ سعيد!

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

للقيام بذلك، سوف ترغب في نقل GetFromServer() اتصل بـ أ BackgroundWorker.ثم حرك

    this.Hide();
    _serverData = new ArrayList();
    _thisData.Add(_allServerNarrators);
    _thisData.Add(_serverNarrators);

رمز إلى BackgroundWorker_RunWorkerCompleted معالج الحدث.

لاستخدام ال BackgroundWorker:

1) تهيئة BackGroundWorker

  BackgroundWorker myWorker = new BackgroundWorker();

2) إضافة معالجات الأحداث

  myWorker.DoWork += new DoWorkEventHandler(myWorker_DoWork);
  //put the work you want done in this one

  myWorker.RunWorkerCompleted += 
      new RunWorkerCompletedEventHandler(myWorker_RunWorkerCompleted);
  //this gets fired when the work is finished

3) إضافة التعليمات البرمجية إلى معالجات الأحداث.

4) اتصل myWorker.RunWorkerAsync() لبدء العمل.

كملاحظة منفصلة، ​​يبدو أنك لا تفعل أي شيء مع ArrayList التي تقوم بتمريرها إلى مُنشئ شاشة البداية.هل هذا مقصود؟

لسوء الحظ، ليس لدي سمعة كافية للتعليق على إجابة شخص ما بعد. :( هذا المقصود أن يكون الجواب على التعليق العقيد الذعر على هانز مساري الإجابة.

مشكلته كانت ذلك MessageBox يظهر من new FormMain(args)سوف تظهر وراء شاشة البداية. المفتاح هو استدعاء MessageBox من مؤشر الترابط الذي يعمل فيه شاشة البداية في:

splashScreen.Invoke(new Action(() => {
    MessageBox.Show(splashScreen, "the message");
}));

أين splashScreen هو مرجع إلى كائن شاشة Splash التي تم إنشاؤها في OnCreateSplashScreen ومن الواضح أن يجب أن تعطى إلى الجديد Form1 هدف.

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