Скройте форму вместо того, чтобы закрыться, когда близкая кнопка нажала

Когда пользователь нажимает X кнопок на форме, как я могу скрыть их вместо того, чтобы закрыть их?

Я попробовал this.hide() в FormClosing но это все еще закрывает форму.

58
задан Danny Beckett 11 August 2013 в 23:38
поделиться

5 ответов

так:

private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing) 
    {
        e.Cancel = true;
        Hide();
    }
}

(через Тим Хаффман)

93
ответ дан 24 November 2019 в 18:41
поделиться

из MSDN:

Чтобы отменить закрытие формы, установите свойство Отмена свойства FormClosingEventArgs, переданного обработчику события, на true.

Так что отмените, а затем спрячьтесь.

8
ответ дан 24 November 2019 в 18:41
поделиться

Таково поведение модальных форм. Когда вы используете форму.ShowDialog(), вы просите об этом поведении. Причина этого в том, что form.ShowDialog не возвращается до тех пор, пока форма не будет скрыта или уничтожена. Поэтому, когда форма скрыта, насос внутри формы.ShowDialog уничтожает её, чтобы она могла вернуться.

Если вы хотите показать и скрыть форму, то вы должны использовать диалоговую модель Modeless. http://msdn.microsoft.com/en-us/library/39wcs2dh(VS.80).aspx

form.Show() возвращается немедленно, вы можете показывать и скрывать это окно сколько угодно, и оно не будет уничтожено до тех пор, пока вы явно не уничтожите его.

Когда вы используете модельные формы, которые не являются дочерними по отношению к модальным формам, то вы также должны запустить почтовый насос, используя Application.Run или Application.DoEvents в цикле. Если резьба, которая создает форму, выходит, то форма будет уничтожена. Если этот поток не запустит насос, то формы, которыми он владеет, не будут реагировать.

Редактирование: звучит так, как будто ApplicationContext предназначено для решения этой проблемы. http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx

В основном, вы получаете класс из ApplicationContext, передаете экземпляр вашего ApplicationContext в качестве аргумента в Application.Run()

// Create the MyApplicationContext, that derives from ApplicationContext,
// that manages when the application should exit.

MyApplicationContext context = new MyApplicationContext();

// Run the application with the specific context. 
Application.Run(context);

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

Не зная больше о наследственности Ваших форм и Ваших правилах принятия решения о том, когда скрывать формы, а когда выходить, нельзя быть более точным.

.
2
ответ дан 24 November 2019 в 18:41
поделиться

Обратите внимание, что при этом (было размещено несколько ответов), вам также необходимо найти способ ВСЕГО закрыть форму, когда пользователь действительно хочет этого. Это действительно становится проблемой, если пользователь пытается выключить машину во время работы приложения, потому что (по крайней мере, на некоторых ОС) это остановит правильное или эффективное выключение ОС.

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

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    StackTrace trace = new StackTrace();
    StackFrame frame;
    bool bFoundExitCommand = false;
    for (int i = 0; i < trace.FrameCount; i++)
    {
        frame = trace.GetFrame(i);
        string methodName = frame.GetMethod().Name;
        if (methodName == "miExit_Click")
        {
            bFoundExitCommand = true;
            Log("FormClosing: Found Exit Command ({0}) - will allow exit", LogUtilityLevel.Debug3, methodName);
        }
        if (methodName == "PeekMessage")
        {
            bFoundExitCommand = true;
            Log("FormClosing: Found System Shutdown ({0}) - will allow exit", LogUtilityLevel.Debug3, methodName);
        }
        Log("FormClosing: frame.GetMethod().Name = {0}", LogUtilityLevel.Debug4, methodName);
    }
    if (!bFoundExitCommand)
    {
        e.Cancel = true;
        this.Visible = false;
    }
    else
    {
        this.Visible = false;
    }
}
3
ответ дан 24 November 2019 в 18:41
поделиться

Я прокомментировал предыдущий ответ, но решил предоставить свой. Основываясь на вашем вопросе, этот код похож на верхний ответ, но добавляет возможность еще одного упоминания:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing) 
    {
        e.Cancel = true;
        Hide();
    }
}

Если пользователь просто нажимает на X в окне, форма скрывается; если что-то еще, например, Task Manager, Application.Exit() или Windows shutdown, форма будет должным образом закрыта, так как будет выполнен оператор return.

53
ответ дан 24 November 2019 в 18:41
поделиться
Другие вопросы по тегам:

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