Как я могу скрыть form1 во время выполнения Application.Run (form1)? - PullRequest
3 голосов
/ 04 декабря 2010


У меня есть форма 1, с которой я запускаю Application.Run.

Я хочу скрыть эту форму (она мне нужна, потому что я запускаю некоторые вещи в фоновом режиме, поэтому они должны выполняться) иОткройте другую форму для входа в систему.

Я пытаюсь это сделать, выполнив в конструкторе form1 команду this.Hide(); и, если вход выполнен успешно, покажите мой form1, но, похоже, он не работает.Есть идеи?

Ответы [ 7 ]

8 голосов
/ 18 декабря 2011

Просто переопределите метод OnVisibleChanged и измените видимость формы там, примерно так:

protected override void OnVisibleChanged(EventArgs e)
{
    base.OnVisibleChanged(e);
    this.Visible = false;
}

И это все! Просто и чисто.

2 голосов
/ 04 декабря 2010

Вы можете переопределить SetVisibleCore в своем классе Form1, чтобы экземпляр Form1 скрывался при запуске.Итак, вот пример, который будет скрывать и держать форму скрытой, конечно, вы должны добавить некоторую логику, которая решит, когда на самом деле должна быть разрешена форма для отображения.

public partial class Form1 : Form 
{ 
  public Form1() 
  { 
    InitializeComponent(); 
  } 

  protected override void SetVisibleCore(bool value) 
  {       
    // Quick and dirty to keep the main window invisible
    // you can put some logic here to decide when to use the
    // incomming value and when to force it to be false as I 
    // am showing here.       
    base.SetVisibleCore(false); 
  } 
} 

Вот простой пример, хотянадуманный.Form1 запускается невидимым и показывает Form2, когда Form2 закрывается, это позволяет Form1 становиться видимым и показывает форму.

using System;
using System.Windows.Forms;

namespace HideMainWinForm
{
  public partial class Form1 : Form
  {
    // Initially the main form cannot show
    private bool _canShow = false; 

    public Form1()
    {
      InitializeComponent();

      Form2 frm = new Form2();
      frm.FormClosed += new FormClosedEventHandler(frm_FormClosed);
      frm.Show();      
    }

    void frm_FormClosed(object sender, FormClosedEventArgs e)
    {
      // Once Form2 is closed we now allow the main form to
      // become visible.
      _canShow = true;
      this.Show();
    }

    protected override void SetVisibleCore(bool value)
    {
      base.SetVisibleCore(_canShow && value);
    }
  }
}
2 голосов
/ 04 декабря 2010

См. Это: Использование класса ApplicationContext для полной инкапсуляции функциональности заставки

В основном речь идет о том, как вы сначала отобразите всплывающую форму, а затем, когда вы закончите загрузку, как вызывать основную форму. (Если вы скрываете основную форму, когда делаете что-то в фоновом режиме, рассмотрите заставку)

Цитата из введения: Это не пример того, как создать заставка для вашего приложения. это статья объясняет чистый способ инкапсулировать заставку функциональность в унаследованную Класс ApplicationContext. Эта статья также подробно показывает, что происходит за кулисами, когда приложение WinForm начинается.

0 голосов
/ 10 ноября 2018

Вы можете использовать этот способ.Однако вы должны обратить внимание на методы, которые используют await и async.

protected override void OnVisibleChanged(EventArgs e){
    base.OnVisibleChanged(e);
    this.Visible = false;
}

Методы, которые используют (await и async), должны иметь слово (result) в инициализации формы.

Пример:

public frmForm1() {
    InitializeComponent();
    try {
        if (Program.LaunchedViaStartup == true) {
            var varclsReturnBack = funcStartBackGroundObjectsAsync().Result;
        }
    } catch (Exception varException) {
        Console.Write(varException.Message);
    }
}
0 голосов
/ 24 июля 2013

В Windows Forms есть событие, которое идеально подходит для этого и называется Form.Shown. Он вызывается только один раз для каждого объекта формы, когда форма отображается впервые. По сути, это ответ digEmAll, но уже встроенный.

Добавить обработчик событий в конструктор, который вызывается Form1.Shown, а затем в обработчик с именем Hide()

public form1()
{
    InitializeComponent()
    this.Shown += new EventHandler(form1_Shown);
    // call splash page
}

void form1_Shown(object sender, EventArgs e)
{
    this.Hide()
}
0 голосов
/ 04 декабря 2010

Проблема заключается в следующем:

вызывая this.Hide() в конструкторе, который вы на самом деле установили this.Visible = false, но сразу после создания формы вызывается form.Show (Application.Run) и form.Show внутренне устанавливает this.Visible = true (ну, конечно, это противоположность Hide ...).

Вы можете сделать так:

private bool firstShow = true;

protected override void OnShown(EventArgs e)
{
    if (firstShow)
    {
        this.Hide();
        firstShow = false;
        return;
    }
    base.OnShown(e);
}

Форма появится на мгновение, а затем сразу исчезнет.

Логический флаг firstShow позволяет скрыть форму только для первого вызова Show(), в то время как для следующих вызовов она будет работать как обычно.

0 голосов
/ 04 декабря 2010

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

Первый - просто выполнить фоновую работу до того, как вы создадите форму и вызовете Application.Run.

Второй вариант, если вам нужен цикл сообщений, чтобы быть активным, пока вы выполняете фоновую работу, это использовать перегрузку Application.Run, которая не принимает From в качестве параметра, и позже показывать свою форму именно тогда, когда вы хочу. Единственный улов заключается в том, что вам придется вручную вызывать Application.Exit или Application.ExitThread, когда вы хотите завершить приложение (потому что у него не будет формы, чье событие Close можно просмотреть).

Итак, ваш код может выглядеть примерно так:

void Main()
{
    // trigger some background work
    ...

    // and start the message pump
    Application.Run();
}


void SomeBackgroundWork()
{
    // let's say now you completed the background work and you want to show your main Form
    MyForm f = new MyForm();
    f.Close += delegate { Application.Exit(); };
    f.Show();
}

Пожалуйста, прокомментируйте, если нужны пояснения ...

...