this.Visible在Windows窗体中不起作用
我有个问题。 我需要在窗口加载时隐藏我的窗口。 但
private void Form1_Load(object sender, EventArgs e) { this.Visible = false; }
不pipe用。 而财产Visible
仍然如此。 我错过了什么吗?
是的,Visible属性在Windows窗体中是一个大问题,这就是实际获取创build的句柄并导致OnLoad()运行的原因。 换句话说,窗口直到可见才会存在。 它会忽略企图解决这个问题。
如果您使用NotifyIcon,想要仍然创build句柄但不使窗口可见,这是相当常见的。 你可以通过覆盖SetVisibleCore来实现这个function:
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应用程序中testing它,它的工作。
(也只是发现这个: 启动时单表隐藏
我认为从窗体的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()
将在以后被调用,从而解决你的问题。
我相信这是因为这个窗口直到这个事件发生之后才真正存在。 最好的地方是这样的:
if (x == 1) { form1.ShowForm(); } else { // Don't show the form }
如果你真的需要在表单本身内部完成,那么我认为你需要使用Activated事件。
编辑:
你也可以尝试这样的:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Form1 myform = new Form1(); if (myform.CheckStuff()) { Application.Run(myform); } }
使用this.Opacity = 0;
使用this.Hide()
来隐藏你的窗口。 this.Close(
)closures
在Shown事件中调用Hide(),Hide()只设置Visible为false,并且在显示表单之前,Visible属性已经是false …