【问题标题】:this.Visible is not working in Windows Formsthis.Visible 在 Windows 窗体中不起作用
【发布时间】:2011-04-14 03:37:04
【问题描述】:

我有问题。我需要在窗口加载时隐藏我的窗口。但是

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

不工作。并且属性Visible 保持不变。我错过了什么吗?

【问题讨论】:

    标签: c# winforms visible


    【解决方案1】:

    是的,Visible 属性在 Windows 窗体中很重要,这就是实际创建句柄并导致 OnLoad() 运行的原因。换句话说,窗口在可见之前是不存在的。它会忽略撤消此操作的尝试。

    如果您使用 NotifyIcon,希望仍然创建句柄但不使窗口可见是很常见的。您可以通过覆盖 SetVisibleCore 来实现:

    protected override void SetVisibleCore(bool value) {
        if (!this.IsHandleCreated) {
            value = false;
            CreateHandle();
        }
        base.SetVisibleCore(value);
    }
    

    请注意,在窗口真正可见之前,OnLoad 仍然不会运行,因此如有必要,请将代码移动到构造函数中。只需在 NotifyIcon 的上下文菜单事件处理程序中调用 Show() 即可使窗口可见。

    【讨论】:

      【解决方案2】:

      您似乎可以使用以下内容:

      private void Form1_Load(object sender, EventArgs e)
      {
          this.Opacity = 0;
          this.ShowInTaskbar = false;
      }
      

      我刚刚在一个 winforms 应用程序中对其进行了测试,它确实有效。

      (也刚刚发现这个:Single Form Hide on Startup

      【讨论】:

        【解决方案3】:

        使用this.Opacity = 0;

        【讨论】:

          【解决方案4】:

          我认为从表单的 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.
          

          【讨论】:

          • 但这是我的主要形式,我如何用这种语法控制它?
          【解决方案5】:

          像这样在 Windows 事件循环中调用:

          WindowsFormsSynchronizationContext.Current.Post((obj) => this.Hide(), null);
          

          所以Hide() 将在稍后被调用,从而解决您的问题。

          【讨论】:

            【解决方案6】:

            我相信这是因为窗口在此事件之后才真正存在。执行此操作的最佳位置是在表单之外:

            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);
                    }
                }
            

            【讨论】:

            • 我试过了。但在 hide 它出现然后消失之前。我不想要它。
            • 那么我认为您必须在显示表格之前进行所有检查。注意:即使这是您的主窗体,您也可以使用 Main() 函数进行此检查。
            • 但是我需要这个隐藏和运行,我不能在开始之前做我的事情。
            • 如果您有需要使用的函数,那么您可以公开它们,实例化表单并从表单外部调用函数。请参阅编辑后的答案。
            【解决方案7】:
            this.Opacity = 0;
            this.ShowInTaskbar = false;
            

            【讨论】:

              【解决方案8】:

              在 Shown 事件中调用 Hide(),Hide() 只会将 Visible 设置为 false,并且在显示表单之前 Visible 属性已经为 false...

              【讨论】:

                【解决方案9】:

                使用this.Hide() 隐藏您的窗口。 this.Close() 关闭

                【讨论】:

                  猜你喜欢
                  • 2011-03-28
                  • 2012-04-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-07-02
                  • 2014-07-03
                  相关资源
                  最近更新 更多