C # winforms запуска (всплеск) форма не скрывается - PullRequest
9 голосов
/ 04 февраля 2009

У меня есть приложение winforms, в котором я использую 2 формы для отображения всех необходимых элементов управления. Первая форма - это заставка, на которой пользователю сообщается, что она загружается и т. Д. Поэтому я использую следующий код:

Application.Run( new SplashForm() );

Как только приложение завершит загрузку, я хочу, чтобы SplashForm скрывался, или меня отправляли на задний план и отображали основной. В настоящее время я использую следующее:

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

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

То, что я вижу, это то, что MainForm отображается, но SplashForm все еще видна «сверху». В данный момент я нажимаю на MainForm, чтобы вручную вывести его на передний план. Любые идеи о том, почему это происходит?

Ответы [ 4 ]

21 голосов
/ 04 февраля 2009

Возможно, вы просто хотите закрыть всплывающую форму, а не отправлять ее обратно.

Я запускаю форму-заставку в отдельном потоке (это класс 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();
        splashForm = null;
    }
...
}

и основная функция программы выглядит следующим образом:

[STAThread]
static void Main(string[] args)
{
    SplashForm.ShowSplashScreen();
    MainForm mainForm = new MainForm(); //this takes ages
    SplashForm.CloseForm();
    Application.Run(mainForm);
}
5 голосов
/ 05 ноября 2009

Это крайне важно, чтобы предотвратить закрытие экрана-заставки и переместить основную форму на фон после ее закрытия:

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

Добавьте этот класс формы всплеска.

2 голосов
/ 04 февраля 2009

Если я правильно понял, вы должны просто использовать Application.Run в главной форме. Так что сначала покажите свой всплеск, просто используя что-то вроде:

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

А затем закройте его вручную в MySplash, когда захотите.

Или покажите его в основных формах обработчика события Load, а затем подождите, пока он не закроется или что-то еще, пока не завершите метод Load. (Возможно, установите Visible в false, прежде чем показывать его, а затем верните в true.

1 голос
/ 04 февраля 2009

Я считаю, что это может быть недостатком дизайна в моем текущем дизайне!

Я думаю, что лучший способ достичь того, что мне нужно, это контролировать все из MainForm. Так что я могу использовать:

Application.Run(new MainForm());

Это будет отвечать за отображение / обновление / скрытие SplashScreen. Таким образом, я могу получить необходимые сложные взаимодействия с остальной частью системы, управляемой MainForm.

...