我有一个问题。我需要在窗口加载时隐藏我的窗口。但是
private void Form1_Load(object sender, EventArgs e)
{
this.Visible = false;
}
不起作用了,Visible
属性仍然为true。我是不是漏掉了什么?
是的,Visible属性在Windows Forms中非常重要,它会创建句柄并导致OnLoad()方法运行。换句话说,窗口在被显示之前并不存在。而且尝试撤销这个操作是无效的。
如果你使用NotifyIcon,通常希望仍然创建句柄但不显示窗口。你可以通过重写SetVisibleCore方法实现这一点:
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
value = false;
CreateHandle();
}
base.SetVisibleCore(value);
}
请注意,OnLoad仍然不会在窗口实际可见之前运行,因此如果必要,将代码移到构造函数中。只需在NotifyIcon的上下文菜单事件处理程序中调用Show()方法即可使窗口可见。
看起来您可以使用以下内容:
private void Form1_Load(object sender, EventArgs e)
{
this.Opacity = 0;
this.ShowInTaskbar = false;
}
我刚刚在WinForms应用程序中测试了它并且它有效。
(还发现这个:单窗体启动时隐藏)
我认为在表单的Load事件中设置可见性并不是一个好主意。相反,我会通过添加一个公共方法来实现:
public void LoadForm(...)
{
// do the all the initializations
}
并调用方法加载表单。除非您明确显示它,否则表单不应可见:
MyForm instance = new MyForm();
instance.LoadForm(...);
// instance.Show(); or ShowDialog() for dialog form not sure exactly the syntax.
将您的调用放入 Windows 事件循环中,如下所示:
WindowsFormsSynchronizationContext.Current.Post((obj) => this.Hide(), null);
Hide()
,因此解决您的问题。this.Opacity = 0;
。我认为这是因为窗口直到此事件之后才真正存在。最好在表单外部执行此操作:
if (x == 1)
{
form1.ShowForm();
}
else
{
// Don't show the form
}
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 myform = new Form1();
if (myform.CheckStuff())
{
Application.Run(myform);
}
}
this.Opacity = 0;
this.ShowInTaskbar = false;
this.Hide()
隐藏你的窗口。使用 this.Close()
关闭。