我在C#中有以下代码:
Form f = new MyForm();
f.Visible = false;
f.Show();
f.Close();
尽管f.Visible = false
,我看到表格的闪光然后消失了。我需要做些什么才能使这个表格不可见?
我需要在应用程序启动期间显示表单(隐形),因为这样做会在显示此表单时消除冷启动延迟。
答案 0 :(得分:15)
如果您想在没有实际看到的情况下显示表单,可以执行以下操作:
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);
}
答案 1 :(得分:11)
到目前为止,保持表单不可见的最简单方法就是不显示它。在Winforms中这是一个大问题,调用Show()或将Visible属性设置为true(同样的事情)做 lot 的事情。这是创建本机Windows窗口的方式。在典型的.NET'懒惰'时尚。任何将Visible设置为false的尝试(如在OnLoad中)都将被击败。
从技术上讲,你可以覆盖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()在窗口实际可见之前不会运行,因此请将代码移至构造函数或覆盖(如果需要)。
答案 2 :(得分:9)
只是因为f.Show()
正在使表单再次显示为f.Close()
正在关闭它...所以闪存。
如果您看到MSDN doc for Form.Show()方法,则会明确提及:
显示控件等效,将可见属性设置为 true 。调用Show方法后,Visible属性返回值true,直到调用Hide方法。
<小时/> 如果您不想要闪光灯,则根本不显示表格。
答案 3 :(得分:4)
您需要编辑MyForm类,并添加以下覆盖方法:
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组件需要一个Window句柄),我不得不运行Application.Run (formInstance)调用表单的Show方法。通过强制表单始终不可见,您将获得一个窗口句柄和一个消息循环,而不会在屏幕上看到任何内容。
答案 4 :(得分:0)
我创建了一个帮助方法来显示不可见的形式,随后的SELECT * FROM (
SELECT *,
(DATEDIFF(day, Date, CurrentDate)) AS Age
FROM Order_Member om
INNER JOIN Other_Table ot on om.id = ot.id -- Here
)sub
WHERE Age > 7
调用将通常显示窗口:
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;
}
}
事件将触发)而不会闪烁。