Подтвердить что ты не робот

С#/.NET - WinForms - создание формы без ее отображения

Я изменяю видимость формы на false во время события загрузки, и форма все же показывает себя. Какое правильное событие для привязки this.Visible = false; к? Я бы хотел создать экземпляр Form1, не показывая его.

using System;
using System.Windows.Forms;

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

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

    }
}
4b9b3361

Ответ 1

Независимо от того, насколько вы пытаетесь установить свойство Visible до того, как форма была показана, она появится. Как я понимаю, это потому, что это MainForm текущего ApplicationContext. Один из способов автоматической загрузки формы, но не показывать при запуске приложения, - это изменить метод Main. По умолчанию это выглядит примерно так (.NET 2.0 VS2005):

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

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

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Form1 f = new Form1();
    Application.Run();        

}

Я не совсем уверен, как это полезно, но, надеюсь, вы это знаете; o)

Обновление: кажется, что вам не нужно устанавливать свойство Visible в false или предоставить экземпляр ApplicationContext (который будет автоматически создан для вас "под капотом" ). Сократите код соответственно.

Ответ 2

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

bool isVisibleCore = false;
protected override void SetVisibleCore(bool value)
{
    base.SetVisibleCore(isVisibleCore);
}

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

Ответ 3

Мне потребовалось некоторое время, чтобы найти надлежащим образом работающее решение.

Задайте свойства с именем WindowState для Minimized и ShowInTaskbar в False в окне свойств. После того, как ваша форма будет полностью загружена, вызовите строки под кодом.

        this.ShowInTaskbar = true;
        this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
        //this.WindowState = System.Windows.Forms.FormWindowState.Normal;

PS: Это решение протестировано на Visual С# 2008 Express Edition

Ответ 4

Просто создайте экземпляр Form1 и не вызывайте методы, чтобы показывать/отображать его. Но я уверен, что вы делаете что-то не так.

Ответ 5

Как установить свойство Opacity на 0 при создании и обратно до 100, когда вы хотите показать форму?

Ответ 6

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

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

что не сработало:

решение переопределения SetVisibleCore не создало форму

а также

Application {
 Form1 f = new Form1();
 Application.Run(); 

):

Ответ 7

Попробуйте событие VisibleChanged.

Ответ 8

Я бы предложил создать экземпляр формы в событии, предшествующем событию _Show, например конструктору, после вызова IntializeComponent().

Ответ 9

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

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

Ответ 10

Если это ваша основная форма, не может быть лучшего места, чем событие Shown. Но в этом случае вы получите мерцание.

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

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

Ответ 11

Для мерцания, показанного без разрешения, также установите расположение формы вне экрана во время загрузки:

private Point startuplocation;

private void Form1_Load(object sender, EventArgs e)
{
    this.startuplocation = this.Location;
    this.Location = new Point(-1000, -1000);
}

private void Form1_Shown(object sender, EventArgs e) //fires first time shown
{
    this.Visible = false;
    this.Location = this.startuplocation;
}

Ответ 12

Вы пробовали

this.Hide();

в событиях form_load или form_activated

Ответ 13

Установите visibilty в конструкторе после init, а затем this.Show() позже

Ответ 14

InitializeComponent() устанавливает this.Visible = true, так как вы указали, что форма должна быть видимой в дизайнере (или она по умолчанию соответствует этому). Вы должны установить Visible в false в конструкторе, и он не будет вызываться InitializeComponent(). Затем вы можете сделать его видимым в любое время.

Ответ 15

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

Вы звоните Show() или ShowDialog() где-нибудь? Я не уверен, что это поведение по-прежнему присутствует, но по крайней мере в прошлых версиях фреймворка вызов ShowDialog() не вызывал событие Load, поэтому, возможно, это ваша проблема (хотя я думаю, что вызов ShowDialog() то скрытие модальной формы было бы плохой практикой!)

Если вам нужно создать созданный дескриптор (и ручки для элементов управления), что бы вы ни пытались сделать, лучше было бы установить StartLocation на Manual, а затем установить Position свойство для внеэкранного местоположения. Это создаст и покажет форму, делая ее невидимой для пользователя.

Ответ 16

Да, действительно, один из элегантных способов взглянуть на ваш код, чем на визуальные приложения, - это фликер формы, скрываясь в событии конструктора/загрузки.