C#如何在启动时隐藏新窗体

4
我有一个表单是隐藏的,它会加载一个子表单,第二个表单也应该是隐藏的。
请注意:我不能使用。
ShowInTaskbar = false; //  should be hidden too

如果我使用(隐藏/显示)并且不可见,我就无法在表格之间进行通信,直到可见 = true 。

  this.SetParameterValueCallback += new SetParameterValueDelegate(ShowMain.SetParamValueCallbackFn);
        ShowMain.AddItemCallback = new AddItemDelegate(this.AddItemCallbackFn);
        //Showsub.Show();
        Showsub.Hide(); // not working

到目前为止,我已经尝试过了

this.Visible = false; // didnt work

 BeginInvoke(new MethodInvoker(delegate
            {
                Hide();
            })); // didnt work

base.SetVisibleCore(false); // didnt work, Im not able communicate between form
6个回答

6

我不太明白为什么你可以在其中一个中让它工作,但在另一个中却不能。如果要防止表单在调用其Show()方法时变得可见,则需要覆盖SetVisibleCore方法。也许您可以利用此代码:

private bool mAllowVisible = false;

public bool ReallyVisible {
  get { return mAllowVisible; }
  set {
    mAllowVisible = value;
    if (value) this.Visible = true;
  }
}

protected override void SetVisibleCore(bool value) {
  if (value && !IsHandleCreated) CreateHandle();  // Ensure Load event runs
  if (!ReallyVisible) value = false;
  base.SetVisibleCore(value);
}

4

对于未来的谷歌搜索者...

有时候你想让表单不可见,但是它认为自己是可见的(例如,如果通过选定答案中的方法将表单设置为不可见,则ReportViever控件将不会呈现任何内容),或者你想在程序启动时在另一个线程中显示第二个表单,并且不想通过闪烁第一个表单的标题来打扰用户...

如果是这样,你只需要在form_Load事件中设置Opacity = 0,它就可以完成任务。这种神奇的Windows行为从Windows 2000开始就已经存在,并在某些情况下非常有帮助。


1

汉斯·帕桑特的代码的另一种版本是在初始隐藏发生时立即切换开关:

    private bool _hasHiddenInitially = false;

    protected override void SetVisibleCore(bool value)
    {
        if (value && !IsHandleCreated) CreateHandle(); // Ensure Load event runs
        if (!_hasHiddenInitially) value = false;
        base.SetVisibleCore(value);
        _hasHiddenInitially = true;
    }

我知道这已经过时了,但是经过几个小时的搜索,这对我的应用程序非常有帮助。你太棒了!谢谢。 - hyperexpert

1

也许我没有理解问题

但是,如果你有任何表单,你可以使用formobject.Visiable = false来隐藏它

Form m = new Form();
m.Visible = false;

1

这是我在表单上的做法,如果你使用 frm2.Hide(); 它可能会奏效。

  private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            main_normal frm2 = new main_normal();
            this.Hide(); //Hides Form1

            frm2.ShowDialog(); //Displays main_normal

            this.ShowDialog(); //After the main_normal is closed, again displays Form1
        }
        catch (Exception ex)
        {
            //this.Show();
            MessageBox.Show(ex.Message, "wub wub Noe feilet men eg vet isje ka", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

就像@darkmage所做的那样,在您的主窗体中创建第二个窗体的新实例之后,才能对其进行任何操作。然后,您只需隐藏主窗体并显示第二个窗体即可。如果您不想以对话框样式显示窗体,还可以使用.Show()方法。 - ryanulit

0
    public NewForm()
    {
        InitializeComponent();


        SetVisibleCore(false);


    }

    private bool setCore = false;

    protected override void SetVisibleCore(bool value)
    {
        base.SetVisibleCore(setCore ? value : setCore);
    }

也许这可以帮助您


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接