этот.Видимый не работает в Windows Forms

у меня проблема. Мне нужно спрятать окно при загрузке окна. Но!--3-->

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

не работает. И собственность Visible остается true. Я что-то упускаю?

9 ответов


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

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

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

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


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

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

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

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


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

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.

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

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

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


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

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

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

EDIT:

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

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

        Form1 myform = new Form1();
        if (myform.CheckStuff())
        {
            Application.Run(myform);
        }
    }

использовать this.Opacity = 0;


this.Opacity = 0;
this.ShowInTaskbar = false;

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


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