C # /. NET - WinForms - Создание формы, не показывая ее - PullRequest
22 голосов
/ 30 апреля 2009

Я изменяю Видимость формы на false во время события загрузки, И форма все еще показывает себя. Какое правильное событие связать это. 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;
        }

    }
}

Ответы [ 18 ]

23 голосов
/ 30 апреля 2009

Независимо от того, сколько вы пытаетесь установить свойство 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();        

}

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

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

11 голосов
/ 28 июля 2012

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

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

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

10 голосов
/ 08 февраля 2012

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

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

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

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

2 голосов
/ 09 декабря 2012

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

2 голосов
/ 21 января 2013

решение, с которым я могу жить поэтому форма создается и 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(); 

):

2 голосов
/ 30 апреля 2009

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

1 голос
/ 30 апреля 2009

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

private void Form1_Shown(object sender, EventArgs e)
    {
        this.Visible = false;
    }
1 голос
/ 30 апреля 2009

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

1 голос
/ 30 апреля 2009

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

1 голос
/ 30 апреля 2009

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

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

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

...