如何拥有两个版本的事件处理程序?

时间:2011-01-06 22:05:05

标签: c# winforms event-handling

我有一个订阅了FormClosing事件的事件处理程序。此事件处理程序在用户退出应用程序时为其提供对话框;像这样:

    private void frmUavController_FormClosing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        DialogResult dlgResult = MessageBox.Show("Are you sure you want to exit?", "Exit?",
            MessageBoxButtons.YesNo, MessageBoxIcon.Question);

        if (dlgResult == DialogResult.Yes)
        {                
            UtilSTKScenario.PauseScenarioAnimation(UtilSTKScenario._stkObjectRoot);                
        }
        else if (dlgResult == DialogResult.No)
        {
            e.Cancel = true;
        }
    }

因为应用程序以并排方式运行;将COM命令注入另一个应用程序 - 如果接收COM命令的应用程序未启动(或在执行期间关闭),我希望我的应用程序退出。这是这样实现的:

    static UtilSTKScenario()
    {
        // give time for active form to show
        Thread.Sleep(100);

        _stkProgramId = ConfigurationManager.AppSettings.Get("stkProgramId");

        if (CheckIfStkIsLaunched())
        {
            InitAllFields();
        }
        else
        {
            HideController dHideController = new HideController(((frmUavController)Form.ActiveForm).HideControllerUi);
            ((frmUavController)Form.ActiveForm).Invoke(dHideController);
            Application.Exit();
        }
    }

调用'Application.Exit()'会触发FormClosing事件。这个我不想要 - 相反,我希望应用程序退出。

有什么想法吗?

WulfgarPro

4 个答案:

答案 0 :(得分:3)

您可以查看FormClosing事件的事件参数。 FormClosingEventArgs具有CloseReason属性,如果表单由用户直接关闭而不是某些其他机制,则可以提供指示。

虽然我不清楚如何显示Application.Exit()来电...如果它也显示为CloseReason.UserClosing,那么您可能需要为表单添加重载[例如SystemClose()]关闭表单并使用实例变量告诉它不要在你的处理程序中提示。

答案 1 :(得分:2)

您的FormClosing事件获取FormClosingEventArgs参数,该参数具有CloseReason属性。如果是CloseReason.ApplicationExitCall,则表单因为调用Application.Exit而关闭。你可以跳过你的“关闭?”在这种情况下提示。

private void frmUavController_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.ApplicationExitCall)
        return;
    // ...

答案 2 :(得分:1)

处理这种事情的典型方法(绕过正常“你要关闭吗?”检查)是使用布尔变量。将其命名为_forceExit,如果外部事件强制关闭则将其设置为true,如果是,则跳过Closing事件中的对话框。

答案 3 :(得分:0)

你能看一下发件人对象吗?我的猜测是发件人对象的不同取决于您实际关闭表单或调用Application.Exit()方法。