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 ]

1 голос
/ 04 октября 2015

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

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;
}
0 голосов
/ 22 сентября 2018

Я установил следующие три свойства для формы:

ShowInTaskbar = false
ShowIcon = false
WindowState = Minimized
0 голосов
/ 06 марта 2018

Я согласен, что это может быть действительно невыносимо, потому что Winforms обычно не выглядят красиво, когда они инициализируют группу элементов управления или заполняют большой DataGridView или что-то еще. Тем не менее, вам нужно, чтобы дескриптор окна существовал, прежде чем вы сможете это сделать, создавая все проблемы, которые были упомянуты.

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

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }
    Size mDeferredSize;
    protected override void OnHandleCreated(EventArgs e)
    {
        // Capture the "real" size...
        mDeferredSize = Size;
        // and set it to nothing...
        Size = new Size(0, 0);
        DoSomeUglyInitialization(showOptionalSplash: true);
        Size = mDeferredSize; // ...and now put it back to the original size    
        base.OnHandleCreated(e);
    }
    private void DoSomeUglyInitialization(bool showOptionalSplash)
    {
        MySplash splash = null; 
        if (showOptionalSplash)
        {
            // We have made some borderless form class with a logo or something...
            splash = new MySplash(); 
            splash.Show();
        }
        // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        // Initialization that REQUIRES A HANDLE, e,g,
        // we might be creating a bunch of controls, or 
        // populating a big DataGridView. Whatever it is,
        // we don't want everyone looking at our biz.
        System.Threading.Thread.Sleep(2500); // (Here simulated...)
        // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        splash?.Dispose();      
    }
}
0 голосов
/ 30 апреля 2009

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

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

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

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

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

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

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

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

Вы пробовали

this.Hide();

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

0 голосов
/ 23 ноября 2011

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

...