C# - 覆盖标准Windows关闭按钮以弹出我的自定义窗体

时间:2014-06-27 12:10:27

标签: c# forms override

是的,noob问题。道歉。

当用户点击窗口上的红色x按钮时,我想弹出一条消息,询问他们是否真的想要退出。我在此网站上发现了类似的问题:Override standard close (X) button in a Windows Form

问题是,我想为MessageBox自定义字体和MessageBoxIcon,遗憾的是它无法完成(或者需要付出很多努力才能完成)。所以,我决定制作自己的表格。

    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (txtID.Text != "" || txtPassword.Text != "")
        {
            base.OnFormClosing(e);
            if (e.CloseReason == CloseReason.WindowsShutDown) return;

            // Confirm user wants to close
            new formConfirmExit().ShowDialog();
        }
    }

我在主窗体下添加了此代码。但是,当我运行我的代码并单击标准关闭按钮时,我的弹出窗口(我所做的自定义表单)并没有完成它的工作。假设我单击"否"按钮,它终止了我的整个程序。随着"是"按钮,弹出窗口再次显示,然后一切都有点停止(在Visual Studio上)和ta-da!例外。

顺便说一句,这些是Yes和No按钮方法(来自我的自定义表格'类):

    private void btnYes_Click(object sender, EventArgs e)
    {
        Application.Exit(); // terminate program (exception is in here)
    }

    private void btnNo_Click(object sender, EventArgs e)
    {
        this.Close(); // close this pop up window and go back to main window
    }

Application.Exit()更改为Environment.Exit(0)完成了Yes按钮的作业,但是我的No按钮终止了该程序。

编辑:当我点击是按钮时,弹出/我的自定义表单再次显示(只有一次)。它将保持该状态(我可以反复点击Yes按钮但没有任何反应)。首先单击Yes按钮(注意本段的第一句)然后单击No按钮,抛出InvalidOperationException。

谢谢。

1 个答案:

答案 0 :(得分:0)

在No_Click中添加:

private void btnNo_Click(object sender, EventArgs e)
{
    DialogResult = DialogResult.No;
}

然后,将表单结束事件更改为以下内容:

protected override void OnFormClosing(FormClosingEventArgs e)
{
    if (txtID.Text != "" || txtPassword.Text != "")
    {
        base.OnFormClosing(e);
        if (e.CloseReason == CloseReason.WindowsShutDown
            || e.CloseReason == CloseReason.ApplicationExitCall)
                return;

        // Confirm user wants to close
        using(var closeForm = new formConfirmExit())
        {
            var result = closeForm.ShowDialog();
            if (result == DialogResult.No)
                e.Cancel = true;   
        }
    }       
}

首先,它检查表单是否通过Application.Exit()关闭,这可能是从您的其他表单触发的,因此它不会重新显示自定义MessageBox。

其次,在自定义表单周围创建一个using语句。这样您就可以保留值。然后,如果用户不想取消,则将对话结果设置为no。如果是这种情况,请将e.Cancel = true设置为停止退出。