Winforms: закрывать модальное диалоговое окно при щелчке вне диалогового окна

Когда Вы - единственный парень, работающий над проектом/проблемой, коммуникация должна быть хорошей, таким образом, формальности не действительно необходимы для этого. Однако, как упомянуто в других сообщениях, хорошие методы, такие как управление версиями все еще применяются. Возвращаемые идеи прочь кого-то оказались очень важными для меня также.

, Хотя коммуникация не является проблемой при работе один, я нашел полезным в некоторых случаях использовать post-it's и сделать персональную плату толпы. Я просто недавно переместился из компании, которая была ориентирована командой на тот, который является отнюдь нет, и это - трудный переход.

Просто другая мысль вроде того, как прийти к решению... книга , Концептуальное Разрушение имеет некоторые хорошие наблюдения относительно того, как к лучшей проблеме решают.

17
задан Kottan 22 December 2010 в 08:56
поделиться

2 ответа

Существуют причины (например, обходные пути и т. Д.), Которые заставляют использовать модальное диалоговое окно. Вы можете эмулировать событие Deactivate, переопределив метод формы WndProc следующим образом:

protected override void WndProc(ref Message m) {
    const UInt32 WM_NCACTIVATE = 0x0086;

    if (m.Msg == WM_NCACTIVATE && m.WParam.ToInt32() == 0) {
        handleDeactivate();
    } else {
        base.WndProc(ref m);
   }
}

Сообщение WM_NCACTIVATE отправляется, чтобы сообщить форме, чтобы указать, активна ли она (WParam == 1) или неактивен (WParam == 0). Если вы щелкнете где-нибудь на родительской форме, ваш модальный диалог начнет «мигать с активностью», сообщая вам, что это сейчас более важно. Это достигается путем отправки ранее упомянутых Сообщений несколько раз (деактивировать -> активировать -> деактивировать -> ... -> активировать).

Но будьте осторожны, если метод handleDeactivate() не завершает вашу форму, он будет вызываться каждый раз, когда приходят сообщения деактивации. Вы должны справиться с этим сами.

Ссылки:
Форум MSDN
Документация MSDN

5
ответ дан 30 November 2019 в 11:31
поделиться

Используйте .Show () вместо .ShowDialog ().

Ручка Деактивировать событие в дочерней форме.

private void frmAdvancedSearch_Deactivate(object sender, EventArgs e)
    {
        this.Close();
    }

Это закроет дочернюю форму, когда пользователь нажимает вне дочернего элемента.

Если вы используете .ShowDialog () для выполнения каких-либо действий после того, как дочерний элемент закрыт, используйте .show () и переопределите событие 'formclosing' дочернего элемента в родительском элементе. Так что это ударит, когда детская форма закроется, и сделайте там свои вещи.

advancedSearch.FormClosing += AdvancedSearch_FormClosing;
advancedSearch.ShowDialog();

private void AdvancedSearch_FormClosing(object sender, FormClosingEventArgs e)
    {
        var advanceSearch = sender as frmAdvancedSearch;
        if (advanceSearch.SelectedItem != null)
        {
            myColumnComboBox.Text = advanceSearch.SelectedItem.Name;
        }
    }

Надеюсь, это поможет.

2
ответ дан 30 November 2019 в 11:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: