23

我在加载事件期间将表单的可见性更改为 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;
        }

    }
}
4

18 回答 18

24

无论您在显示表单之前尝试设置 Visible 属性多少,它都会弹出。据我了解,这是因为它是当前 ApplicationContext 的 MainForm。让表单自动加载但在应用程序启动时不显示的一种方法是更改​​ 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 实例(将在“幕后”为您自动创建)。相应地缩短了代码。

于 2009-04-30T14:02:44.637 回答
11

我知道这是一个老问题,但我只是偶然发现了它,很惊讶没有人提到SetVisibleCore

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

在该代码段中,只要isVisibleCore保持为 false,表单将保持不可见。如果在实例化表单时将其设置为 false,则不会像Visible = false在 Shown 事件中设置那样获得短暂的可见性。

于 2012-07-28T19:10:57.983 回答
10

我花了一些时间才找到一个正常工作的解决方案。

在属性窗口下将名为 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 上测试

于 2012-02-08T07:35:13.620 回答
2

在设计时将 Opacity 属性设置为 0 并在要显示表单时设置回 100 怎么样?

于 2012-12-08T23:51:25.363 回答
2

我可以接受的解决方案,因此创建表单并在创建时调用 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(); 

):

于 2013-01-21T10:30:35.400 回答
2

对于无闪烁的 Shown 解决方案,还要在加载期间将表单的位置设置为屏幕外:

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;
}
于 2015-10-04T00:06:16.127 回答
1

只需创建一个实例,Form1不要调用方法来显示/显示它。但我敢打赌你做错了什么。

于 2009-04-30T13:51:04.803 回答
1

尝试 VisibleChanged 事件。

于 2009-04-30T13:51:41.340 回答
1

我的建议是在 IntializeComponent() 调用之后的 _Show 事件之前的事件中实例化表单,例如构造函数。

于 2009-04-30T13:52:07.407 回答
1

显示的事件可能会给您想要的。尽管表格会在隐藏之前“闪烁”一秒钟。

private void Form1_Shown(object sender, EventArgs e)
    {
        this.Visible = false;
    }
于 2009-04-30T13:56:53.480 回答
1

如果这是您的主要形式,那么可能没有比 Shown 事件更好的地方了。但在这种情况下,你会得到闪烁。

我找不到一个好地方来阻止正在运行的主窗体至少快速显示。即使在加载事件中激活的计时器也不会这样做。

如果它是辅助表单,只需创建它但不显示它。

于 2009-04-30T14:06:55.717 回答
0

你有没有尝试过

this.Hide();

form_loadform_activated事件中

于 2009-04-30T13:51:27.063 回答
0

在构造函数上设置可见性,在 init 之后然后 this.Show() 之后

于 2009-04-30T13:56:39.300 回答
0

InitializeComponent() 设置 this.Visible = true,因为您指定了表单应该在设计器中可见(或者默认为该表单)。您应该在设计器中将 Visible 设置为 false,它不会被 InitializeComponent() 调用。然后,您可以随时使其可见。

于 2009-04-30T13:58:58.450 回答
0

拥有.Visible = falseHide()Load事件中将导致您的表单短暂显示,因为在它变得物理可见和Load事件被触发之间存在时间,尽管文档中的说法相反。

你在打电话Show()还是在ShowDialog()什么地方?我不确定这种行为是否仍然存在,但至少在框架的过去版本中,调用ShowDialog()并没有触发Load事件,所以也许这就是你的问题(尽管我认为调用ShowDialog()然后隐藏模式表单会很糟糕实践!)

如果您必须为您尝试执行的任何操作创建句柄(以及控件的句柄),更好的做法是将 设置StartLocationManual,然后将该Position属性设置为屏幕外位置。这将创建并显示表单,同时使其对用户不可见。

于 2009-04-30T14:01:31.610 回答
0

是的,与应用程序视觉相比,从代码角度来看,真正优雅的一种方式是通过隐藏在构造函数/加载事件中来闪烁表单。

于 2011-11-23T15:05:57.777 回答
0

我同意这真的很令人抓狂,因为 Winform 在初始化一堆控件或填充大 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();      
    }
}
于 2018-03-06T01:33:03.367 回答
0

我为表单设置了这三个属性设置:

ShowInTaskbar = false
ShowIcon = false
WindowState = Minimized
于 2018-09-22T17:29:14.527 回答