Когда пользователь нажимает X кнопок на форме, как я могу скрыть их вместо того, чтобы закрыть их?
Я попробовал this.hide()
в FormClosing
но это все еще закрывает форму.
так:
private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
Hide();
}
}
(через Тим Хаффман)
из MSDN:
Чтобы отменить закрытие формы, установите свойство
Отмена
свойстваFormClosingEventArgs
, переданного обработчику события, наtrue
.
Так что отмените, а затем спрячьтесь.
Таково поведение модальных форм. Когда вы используете форму.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()
вернётся.
Не зная больше о наследственности Ваших форм и Ваших правилах принятия решения о том, когда скрывать формы, а когда выходить, нельзя быть более точным.
.Обратите внимание, что при этом (было размещено несколько ответов), вам также необходимо найти способ ВСЕГО закрыть форму, когда пользователь действительно хочет этого. Это действительно становится проблемой, если пользователь пытается выключить машину во время работы приложения, потому что (по крайней мере, на некоторых ОС) это остановит правильное или эффективное выключение ОС.
Способом решения этой проблемы была проверка трассы стека - есть разница между тем, когда пользователь пытается щелкнуть по 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;
}
}
Я прокомментировал предыдущий ответ, но решил предоставить свой. Основываясь на вашем вопросе, этот код похож на верхний ответ, но добавляет возможность еще одного упоминания:
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
.