C #: показывает невидимую форму - PullRequest
13 голосов
/ 02 марта 2011

У меня есть следующий код в C #:

Form f = new MyForm();
f.Visible = false;
f.Show();
f.Close();

Несмотря на f.Visible = false, я вижу вспышку формы, которая появляется, а затем исчезает. Что мне нужно сделать, чтобы сделать эту форму невидимой?

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

Ответы [ 5 ]

15 голосов
/ 02 марта 2011

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

  public Form1()
  {
     InitializeComponent();
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
     this.ShowInTaskbar = false;
     this.Load += new EventHandler(Form1_Load);
  }

  void Form1_Load(object sender, EventArgs e)
  {
     this.Size = new Size(0, 0);
  }

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

  Timer tmr = new Timer();
  public Form1()
  {
     tmr.Interval = 10000;
     tmr.Tick += new EventHandler(tmr_Tick);
     tmr.Start();

     InitializeComponent();
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
     this.ShowInTaskbar = false;
     this.Load += new EventHandler(Form1_Load);
  }

  void tmr_Tick(object sender, EventArgs e)
  {
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
     this.ShowInTaskbar = true;
     this.Size = new Size(300, 300);
  }

  void Form1_Load(object sender, EventArgs e)
  {
     this.Size = new Size(0, 0);
  }
12 голосов
/ 02 марта 2011

Самый простой способ сохранить форму невидимой - просто не показывать ее. Это большая проблема в Winforms, вызов Show () или установка свойства Visible в true (то же самое) делает lot вещей. Это способ создания собственного окна Windows. В типичном .NET «ленивый» способ. Любая попытка установить для Visible значение false (как в OnLoad) будет побеждена.

Технически это возможно, вы должны переопределить метод SetVisibleCore (). Как это:

    protected override void SetVisibleCore(bool value) {
        if (!this.IsHandleCreated) {
            this.CreateHandle();
            value = false;   // Prevent window from becoming visible
        }
        base.SetVisibleCore(value);
    }

Это гарантирует, что окно не станет видимым в первый раз, когда вы вызываете Show (). Что удобно, например, когда у вас есть NotifyIcon, вы обычно хотите, чтобы значок находился прямо в области уведомлений, и отображать окно, только когда пользователь нажимает на значок. Помните, что OnLoad () не запускается до тех пор, пока окно фактически не станет видимым, поэтому переместите код в конструктор или переопределите, если необходимо.

9 голосов
/ 02 марта 2011

Просто потому, что f.Show() снова делает форму видимой, а f.Close() закрывает ее ... так что вспышка.

Если вы видите MSDN документ для Form.Show () , в нем четко указано, что:

Отображение элемента управления эквивалент для установки Visible свойства true . После вызова метода Show свойство Visible возвращает значение true, пока не будет вызван метод Hide.

<ч /> Если вам не нужна вспышка, просто не показывайте форму вообще.

4 голосов
/ 02 марта 2011

Вам необходимо отредактировать класс MyForm и добавить следующий метод переопределения:

protected override void SetVisibleCore(bool value)
{
    //just override here, make sure that the form will never become visible
    if (!IsHandleCreated) CreateHandle();
    value = false;
    base.SetVisibleCore(value);
}

Вы должны спросить себя, действительно ли это необходимо - вероятно, свидетельствует о плохом дизайне.

Редактировать : Это довольно редко, что вам нужно сделать это, единственная ситуация, которую я использовал, это когда мне нужна форма, на которую я мог бы поместить COM-компонент (так как COM-компонент нуждался в дескрипторе Window), и мне пришлось запустить Application.Run (formInstance), который вызывает метод Show формы. Вынуждая форму всегда быть невидимой, вы получаете дескриптор окна и цикл сообщений, ничего не видя на экране.

0 голосов
/ 27 мая 2017

Я создал вспомогательный метод, который будет показывать невидимую форму, и последующие Show вызовы покажут окно как обычно:

public static class FormHelper
{
    public static void ShowInvisible(this Form form)
    {
        // saving original settings
        bool needToShowInTaskbar = form.ShowInTaskbar;
        WindowState initialWindowState = form.WindowState;

        // making form invisible
        form.ShowInTaskbar = false;
        form.WindowState = FormWindowState.Minimized;

        // showing and hiding form
        form.Show();
        form.Hide();

        // restoring original settings
        form.ShowInTaskbar = needToShowInTaskbar;
        form.WindowState = initialWindowState;
    }
}

Таким образом, форма будет отображена (и событие Load сработает) без каких-либо миганий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...