this.Visible не работает в Windows Forms - PullRequest
19 голосов
/ 18 сентября 2010

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

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

не работает. И свойство Visible остается верным. Я что-то упустил?

Ответы [ 9 ]

36 голосов
/ 18 сентября 2010

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

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

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

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

5 голосов
/ 18 сентября 2010

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

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

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

(Также только что нашел это: Single Form Hideпри запуске

2 голосов
/ 18 сентября 2010

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

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

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

2 голосов
/ 18 сентября 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.
1 голос
/ 18 сентября 2010

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

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

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

EDIT:

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

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

        Form1 myform = new Form1();
        if (myform.CheckStuff())
        {
            Application.Run(myform);
        }
    }
0 голосов
/ 13 апреля 2018
this.Opacity = 0;
this.ShowInTaskbar = false;
0 голосов
/ 18 августа 2015

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

0 голосов
/ 18 сентября 2010

Использование this.Opacity = 0;

0 голосов
/ 18 сентября 2010

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

...