C#/。NET - WinForms - 实例化一个表单而不显示它

时间:2009-04-30 13:47:56

标签: c# .net winforms events visibility

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

答案 0 :(得分:23)

无论您在显示表单之前尝试设置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实例(将在“引擎盖下”为您自动创建)。相应地缩短了代码。

答案 1 :(得分:11)

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

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

在该代码段中,只要isVisibleCore保持为false,表单将保持不可见。如果在实例化表单时将其设置为false,则在“已显示”事件中设置Visible = false时,您将无法获得短暂的可见性闪烁。

答案 2 :(得分: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上进行了测试

答案 3 :(得分:2)

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

答案 4 :(得分: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(); 

):

答案 5 :(得分:2)

如果要在设计时将Opacity属性设置为0,如果要显示表单,请将其设置为100?

答案 6 :(得分:1)

尝试VisibleChanged事件。

答案 7 :(得分:1)

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

答案 8 :(得分:1)

显示的事件可能会让您想要。虽然表单在隐藏之前会“闪烁”一秒钟。

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

答案 9 :(得分:1)

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

print ("please enter values as check([x,y,z])to find min and max")
def check(iterable):
    try:
        (iterable) = int(iterable)

    except:

        print("please Enter number")

    else:
        print("************************")
    it = iter(iterable)
    first = next(it)     # Raises an exception if the input is empty
    minimum = maximum = cumsum = first
    n = 1
    for x in it:
        n += 1
        cumsum += x
        if x < minimum:
            minimum = x
        if x > maximum:
            maximum = x

    return "min:" + str(minimum), "max:" + str(maximum)

答案 10 :(得分:1)

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

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

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

答案 11 :(得分:0)

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

ShowInTaskbar = false
ShowIcon = false
WindowState = Minimized

答案 12 :(得分:0)

我同意这真的很令人抓狂,因为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();      
    }
}

答案 13 :(得分:0)

是的,与您的应用程序相比,对代码的透视真实优雅方式是通过隐藏在构造函数/ load事件中来闪烁表单。

答案 14 :(得分:0)

.Visible = false事件中使用Hide()Load会导致您的表单暂时显示,因为它在物理可见和Load事件之间有时间尽管文档说的相反,但是被解雇了。

您是在某个地方呼叫Show()还是ShowDialog()?我不确定这种行为是否仍然存在,但至少在框架的过去版本中,对ShowDialog()的调用没有触发Load事件,所以也许这是你的问题(尽管我认为调用ShowDialog()然后隐藏模态表单将是一种不好的做法!)

如果你必须为你正在尝试做的事情创建句柄(和控件的句柄),更好的办法是将StartLocation设置为Manual,然后将Position属性设置为屏幕外位置。这将创建并显示表单,同时使其对用户不可见。

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

你试过吗

this.Hide();

form_loadform_activated个活动中