this.Visible не работает в Windows Forms

У меня проблема. Мне нужно скрыть окно при загрузке окна. Но

private void Form1_Load(object sender, EventArgs e)
{
    this.Visible = false;
}

не работает. А свойство Visible остается верным. Я что-то упускаю?


person Barun    schedule 18.09.2010    source источник


Ответы (8)


Да, свойство Visible имеет большое значение в Windows Forms, именно оно фактически создает дескриптор и вызывает запуск OnLoad(). Другими словами, окно не существует, пока оно не станет видимым. И он будет игнорировать попытки отменить это.

Довольно часто хочется создать дескриптор, но не делать окно видимым, если вы используете NotifyIcon. Вы можете добиться этого, переопределив SetVisibleCore:

protected override void SetVisibleCore(bool value) {
    if (!this.IsHandleCreated) {
        value = false;
        CreateHandle();
    }
    base.SetVisibleCore(value);
}

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

person Hans Passant    schedule 18.09.2010

Кажется, вы можете использовать следующее:

private void Form1_Load(object sender, EventArgs e)
{
    this.Opacity = 0;
    this.ShowInTaskbar = false;
}

Я только что проверил это в приложении winforms, и это сработало.

(Также только что нашел это: Скрытие одной формы при запуске

person mpeterson    schedule 18.09.2010

Используйте 1_

person cprcrack    schedule 18.09.2010

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

public void LoadForm(...)
{
   // do the all the initializations
}

и вызовите метод для загрузки формы. Форма не должна быть видна, если вы явно не покажете ее:

MyForm instance = new MyForm();
instance.LoadForm(...);
// instance.Show(); or ShowDialog() for dialog form not sure exactly the syntax.
person David.Chu.ca    schedule 18.09.2010
comment
Но это моя основная форма, как я могу управлять ею с помощью этого синтаксиса? - person Barun; 18.09.2010

Поместите свой вызов в цикл событий Windows следующим образом:

WindowsFormsSynchronizationContext.Current.Post((obj) => this.Hide(), null);

Так что Hide() будет вызываться позже, поэтому решите свою проблему.

person tia    schedule 18.09.2010

Я считаю, что это потому, что окно на самом деле не существует до этого события. Лучшее место для этого вне формы:

if (x == 1)
{
    form1.ShowForm();
}
else
{
    // Don't show the form
}

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

РЕДАКТИРОВАТЬ:

Вы также можете попробовать что-то вроде:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Form1 myform = new Form1();
        if (myform.CheckStuff())
        {
            Application.Run(myform);
        }
    }
person Paul Michaels    schedule 18.09.2010
comment
Я пробовал. Но перед тем, как спрятаться, Он то появляется, то исчезает. А я этого не хочу. - person Barun; 18.09.2010
comment
Тогда я думаю, что вы должны сделать все проверки, которые у вас есть, прежде чем показывать форму. Примечание: даже если это ваша основная форма, вы можете использовать функцию Main() для этой проверки. - person Paul Michaels; 18.09.2010
comment
Но мне нужно это, чтобы спрятаться и убежать, и я не могу делать свои дела, пока не начну. - person Barun; 18.09.2010
comment
Если у вас есть функции, которые вам нужно использовать, вы можете выставить их, создать экземпляр формы и вызвать функции извне формы. Смотрите отредактированный ответ. - person Paul Michaels; 18.09.2010

Вызовите Hide() в событии Shown, Hide() только устанавливает для Visible значение false, и до того, как форма будет показана, свойство Visible уже имеет значение false...

person SijeDeHaan    schedule 18.08.2015

Используйте this.Hide(), чтобы скрыть свое окно. this.Close() чтобы закрыть

person Shantanu Gupta    schedule 18.09.2010