Подтвердить что ты не робот

Скрыть форму, а не закрывать при нажатии кнопки "Закрыть"

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

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

4b9b3361

Ответ 1

Так же:

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

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

Ответ 2

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

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

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

Ответ 3

От MSDN:

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

Так отмените, затем скройте.

Ответ 4

Если вы хотите использовать метод show/hide, я на самом деле сделал это самостоятельно для структуры меню, которую я недавно сделал... Вот как я это сделал:

Создайте себе кнопку и для того, что вы хотите сделать, например, кнопку "Далее" и сопоставьте следующий код с вашей программой. Для следующей кнопки в этом примере код будет выглядеть следующим образом:

btnNext.Enabled = true; //This enabled the button obviously
this.Hide(); //Here is where the hiding of the form will happen when the button is clicked
Form newForm = new newForm(); //This creates a new instance object for the new form
CurrentForm.Hide(); //This hides the current form where you placed the button.

Вот фрагмент кода, который я использовал в своей игре, чтобы помочь вам понять, что я пытаюсь объяснить:

    private void btnInst_Click(object sender, EventArgs e) 
    {
        btnInst.Enabled = true; //Enables the button to work
        this.Hide(); // Hides the current form
        Form Instructions = new Instructions(); //Instantiates a new instance form object 
        Instructions.Show(); //Shows the instance form created above
    }

Таким образом, метод show/hide содержит несколько строк кода, а не делает массивную часть кода для такой простой задачи. Надеюсь, это поможет решить вашу проблему.

Ответ 5

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

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

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;
    }
}

Ответ 6

Это поведение модальных форм. Когда вы используете form.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().

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

Ответ 7

На основании другого ответа вы можете поместить его в свой код формы:

    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        base.OnFormClosing(e);
        if (e.CloseReason == CloseReason.UserClosing)
        {
            e.Cancel = true;
            Hide();
        }
    }

Предпочтительно переопределение: MSDN "Метод OnFormClosing также позволяет производным классам обрабатывать событие без присоединения делегата. предпочтительный метод обработки события в производном классе."