winforms C#多个项目隐藏主窗体仅隐藏一次

5w9g7ksd  于 2023-03-19  发布在  C#
关注(0)|答案(1)|浏览(160)

这真是一个愚蠢的问题。这是细节。我有两个项目。
主项目有一个窗体frmStart,因此需要使用Hide。
第二个项目是一个附加了窗体的类库。
当我第一次单击按钮转到类库时,一切都很好,frmStart被隐藏了。
当我第二次调用类库时frmStart不隐藏?
frmStart将KeyPreview设置为True,并有一个用于关闭它的按钮。
我不得不在类库中为frmStart创建一个新示例,不确定这是否正确。

**我做错了什么?**frmStart代码

private void btnShowLib_Click(object sender, EventArgs e)
    {
        Hide();
        SS = "HI we are from OneB";
        var form = new CLP.form1();
        form.UdpateTextBoxWith(SS);
        form.Show();
    }

类库中的代码

private void btnClose_Click(object sender, EventArgs e)
    {
        Close();
        frmStart fST = new frmStart();
        fST.Show();  
    }
ohtdti5x

ohtdti5x1#

我哪里做错了?
在库中,通过执行以下操作创建并显示一个新的frmStart

frmStart fST = new frmStart();
fST.Show();

这里的fst是一个完全不同的示例,而不是您认为在主项目中创建和显示的那个示例。换句话说,您在主项目中隐藏了原始示例,而在Lib项目中显示了一个新示例。
您可以通过调用Form.ShowDialog方法来显示一个 modal 对话框,而不是调用Form.Show方法来显示一个 non-modal 对话框,从而解决这个问题。这样,您就不需要在库的btnClose_Click中编写任何代码,而只需要在Close();方法中编写代码。
在主项目中:

private void btnShowLib_Click(object sender, EventArgs e)
{
    Hide();
    SS = "HI we are from OneB";
    using (var form = new CLP.form1())
    {
        form.UdpateTextBoxWith(SS);
        form.ShowDialog();
    }
    Show(); // Not executed until after the form is closed.
}

在Lib项目中:

private void btnClose_Click(object sender, EventArgs e) => Close();

如果您有理由显示一个 * 非模态 * 对话框,则将frmStart示例传递给Show方法,然后您可以通过Form.Owner属性访问它。

private void btnShowLib_Click(object sender, EventArgs e)
{
    Hide();
    SS = "HI we are from OneB";
    var form = new CLP.form1();
    form.UdpateTextBoxWith(SS);
    form.FormClosing += (_, __) => form.Owner.Show();
    form.Show(this);
}

// Lib project
private void btnClose_Click(object sender, EventArgs e) => Close();

请注意,处理FormClosing事件以显示所有者,而不是btnClose_Click事件,因为窗体也可以通过窗体的x控制按钮或键盘键关闭。
另一种 * 非模态 * 方式是通过参数化构造函数将frmStart示例传递给Lib的Form,并将其赋给支持字段。

namespace CLP
{
    // Find a better name...
    public class form1 : Form
    {
        private readonly Form form;

        public form1()
        {
            InitializeComponent();
            // ...
        }

        public form1 (Form frm) : this() => form = frm;

        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            form.Show();
            base.OnFormClosing(e);
        }

        private void btnClose_Click(object sender, EventArgs e) => Close();

        // ...
    }
}

主要项目:

private void btnShowLib_Click(object sender, EventArgs e)
{
    Hide();
    SS = "HI we are from OneB";
    var form = new CLP.form1(this);
    form.UdpateTextBoxWith(SS);
    form.Show();
}

相关问题