我在C#中有以下代码:
Form f = new MyForm();
f.Visible = false;
f.Show();
f.Close();
尽管使用了f.Visible = false
,但我仍然看到窗体一闪而过。我需要做什么才能使这个窗体不可见?
在我的应用程序启动画面期间(隐藏地)显示此窗体可以消除显示此窗体时的冷启动延迟,因此我需要这样做。
我在C#中有以下代码:
Form f = new MyForm();
f.Visible = false;
f.Show();
f.Close();
尽管使用了f.Visible = false
,但我仍然看到窗体一闪而过。我需要做什么才能使这个窗体不可见?
在我的应用程序启动画面期间(隐藏地)显示此窗体可以消除显示此窗体时的冷启动延迟,因此我需要这样做。
public Form1()
{
InitializeComponent();
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.ShowInTaskbar = false;
this.Load += new EventHandler(Form1_Load);
}
void Form1_Load(object sender, EventArgs e)
{
this.Size = new Size(0, 0);
}
如果以后您想显示它,只需将所有内容改回来即可。这是一个示例,在10秒后它将显示该表单:
Timer tmr = new Timer();
public Form1()
{
tmr.Interval = 10000;
tmr.Tick += new EventHandler(tmr_Tick);
tmr.Start();
InitializeComponent();
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.ShowInTaskbar = false;
this.Load += new EventHandler(Form1_Load);
}
void tmr_Tick(object sender, EventArgs e)
{
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
this.ShowInTaskbar = true;
this.Size = new Size(300, 300);
}
void Form1_Load(object sender, EventArgs e)
{
this.Size = new Size(0, 0);
}
this.FormBorderStyle = FormBorderStyle.None;
改为 this.WindowState = FormWindowState.Minimized;
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
- mat007保持表单不可见最简单的方法就是不显示它。在Winforms中这是非常重要的,调用Show()或将Visible属性设置为true(两者相同)会执行很多操作。这是本地Windows窗口创建的方式。按照典型的.NET“懒惰”方式,任何试图将Visible设置回false的尝试都将失败。
从技术上讲,这是可能的,您需要覆盖SetVisibleCore()方法。像这样:
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
this.CreateHandle();
value = false; // Prevent window from becoming visible
}
base.SetVisibleCore(value);
}
这将确保在第一次调用Show()时窗口不会变为可见。当你有NotifyIcon时很方便,你通常希望将图标直接显示在通知区域,并且只在用户点击图标时显示窗口。需要注意的是,OnLoad()直到窗口实际变为可见才会运行,因此必要时应将代码移动到构造函数或覆盖中。
f.Show()
让窗体再次可见,而f.Close()
则关闭它...所以flash也会消失。protected override void SetVisibleCore(bool value)
{
//just override here, make sure that the form will never become visible
if (!IsHandleCreated) CreateHandle();
value = false;
base.SetVisibleCore(value);
}
然而,你应该问自己是否真的有必要这样做 - 这可能是设计不良的表现。
编辑: 很少需要这样做,我使用它的唯一情况是当我需要一个可以放置COM组件的表单(因为COM组件需要窗口句柄),并且我必须运行Application.Run(formInstance),它调用窗体的Show方法。通过强制使表单始终不可见,您可以获得窗口句柄和消息循环,而看不到任何屏幕上的内容。
Show
调用将像通常一样显示窗口:public static class FormHelper
{
public static void ShowInvisible(this Form form)
{
// saving original settings
bool needToShowInTaskbar = form.ShowInTaskbar;
WindowState initialWindowState = form.WindowState;
// making form invisible
form.ShowInTaskbar = false;
form.WindowState = FormWindowState.Minimized;
// showing and hiding form
form.Show();
form.Hide();
// restoring original settings
form.ShowInTaskbar = needToShowInTaskbar;
form.WindowState = initialWindowState;
}
}
因此,表单将被呈现(并且Load
事件将被触发),而不会出现任何闪烁。