Как иметь две версии обработчика событий? - PullRequest
0 голосов
/ 07 января 2011

У меня есть обработчик событий, подписанный на событие 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 ]

3 голосов
/ 07 января 2011

Возможно, вы сможете просмотреть аргументы события FormClosing. FormClosingEventArgs имеет свойство CloseReason, которое может давать индикатор, если форма была закрыта пользователем напрямую, в отличие от какого-либо другого механизма.

Хотя мне неясно, как будут выглядеть Application.Exit() вызовы ... Если он также отображается как CloseReason.UserClosing, возможно, вам придется добавить перегрузку в форму [например, SystemClose ()], чтобы закрыть форму и использовать переменную экземпляра, чтобы запретить подсказку в вашем обработчике.

2 голосов
/ 07 января 2011

Ваше событие FormClosing получает параметр FormClosingEventArgs, который имеет свойство CloseReason.Если это CloseReason.ApplicationExitCall, то форма закрывается из-за вызова Application.Exit.Вы можете просто пропустить "закрыть"?подскажите в этом случае.

private void frmUavController_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.ApplicationExitCall)
        return;
    // ...
1 голос
/ 07 января 2011

Типичный способ обработки такого рода вещей (обход обычных проверок «Вы хотите закрыть?») Состоит в использовании логической переменной.Назовите его как _forceExit, установите его в true, если внешнее событие заставляет вас закрыться, и если это правда, пропустите диалоговое окно в вашем событии закрытия.

0 голосов
/ 07 января 2011

Можете ли вы посмотреть на объект отправителя? Я предполагаю, что объект отправителя отличается в зависимости от того, на самом деле вы закрываете форму или вызываете метод Application.Exit().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...