Как я показываю от того, которые были скрыты с помощью
this.Hide();
Я попробовал
MainMenuForm.Show();
и это просто говорит, что мне нужен объект касательно, Я затем попробовал:
MainMenuForm frmMainMenu = new MainMenuForm();
frmMainMenu.Show();
Который, кажется, показывает соответствующую форму. Но когда Вы выходите из приложения, оно все еще сохранено в памяти, потому что оно не показало форму, которая была скрыта, вместо этого оно показало новую версию формы. В действительности имея 2 экземпляра формы (одно скрытое, один видимый).
Просто для уточнения MainMenuForm является формой запуска. Когда (например), Опция 1 нажата, MainMenuForm затем прячется при открытии формы Опции 1. То, что я хотел бы знать, - то, как я заставляю Опцию 1 сформировать это, MainMenuForm открывается, "раскрывают" MainMenuForm и затем закрывают себя.
Какова корректная процедура здесь?
Заранее спасибо.
Когда вы делаете следующее:
MainMenuForm frmMainMenu = new MainMenuForm();
frmMainMenu.Show();
Вы создаете и показываете новый экземпляр MainMenuForm.
Чтобы показать или скрыть экземпляр MainMenuForm, вам необходимо сохранить ссылку на него. Т.е. когда я создаю компактные каркасные приложения, у меня есть статические классы, использующие одноэлементный шаблон, чтобы гарантировать, что у меня когда-либо будет только один экземпляр формы во время выполнения:
public class FormProvider
{
public static MainMenuForm MainMenu
{
get
{
if (_mainMenu == null)
{
_mainMenu = new MainMenuForm();
}
return _mainMenu;
}
}
private static MainMenuForm _mainMenu;
}
Теперь вы можете просто использовать FormProvider.MainMenu.Show ()
, чтобы показать форму и FormProvider.MainMenu.Hide ()
, чтобы скрыть форму.
Шаблон Singleton (спасибо Lazarus за ссылку) - хороший способ управления формами в приложениях WinForms, потому что это означает, что вы создаете экземпляр формы только один раз. При первом доступе к форме через соответствующее свойство форма создается и сохраняется в частной переменной.
Например, при первом использовании FormProvider.MainMenu
создается экземпляр частной переменной _mainMenu. В любой последующий раз, когда вы вызываете FormProvider.MainMenu
, _mainMenu возвращается сразу же без повторного создания экземпляра.
Однако вам не обязательно хранить все классы форм в статическом экземпляре. Вы можете просто иметь форму как свойство в форме, которая управляет MainMenu.
public partial class YourMainForm : Form
{
private MainMenuForm _mainMenu = new MainMenuForm();
protected void ShowForm()
{
_mainMenu.Show();
}
protected void HideForm()
{
_mainMenu.Hide();
}
}
ОБНОВЛЕНИЕ:
Просто прочтите, что MainMenuForm
- это ваша стартовая форма. Реализуйте класс, похожий на мой пример синглтона выше, а затем измените свой код на следующий в файле Program.cs вашего приложения:
Application.Run(FormProvider.MainMenu);
Затем вы можете получить доступ к MainMenuForm
из любого места вашего приложения через Класс FormProvider
.
Сохраните ссылку на форму и вызовите для нее .Hide () и .Show ().
Например:
public class MainWindow : Form
{
private Form _mainMenuForm = new MainMenuForm();
public void btnShowMenuForm_Click(...)
{
_mainMenuForm.Show();
}
public void btnHideMenuForm_Click(...)
{
_mainMenuForm.Hide();
}
//etc
}
В этом примере предполагается, что у вас есть форма, запускающая MainMenuForm.
Самый простой и легкий способ - использовать LINQ и изучить свойство Application.OpenForms
. Я предполагаю, что у вас есть только 1 экземпляр формы (надеюсь!), В противном случае убедитесь, что у скрытой формы есть какое-то общедоступное свойство, чтобы иметь возможность различать ее.
Следующий код откроет для вас скрытие формы:
var formToShow = Application.OpenForms.Cast<Form>()
.FirstOrDefault(c => c is MainMenuForm);
if (formToShow != null)
{
formToShow.Show();
}
Вам нужно сохранить ссылку на первую форму при ее создании, а затем код, содержащий эту ссылку, может вызвать для нее Show
.
Если вы не открываете эту форму откуда-то, но она настроена как форма запуска, вам нужно либо изменить ее, чтобы у вас был метод Main, который открывает эту форму, либо вы можете сохранить в этой форме ссылку на себя. где-нибудь, к которому можно получить доступ из других мест.
Например, быстрым и уродливым способом было бы добавить общедоступное статическое свойство к вашей основной форме, а затем, когда вы скрываете форму, оно также записывает this
в это свойство, которое затем может быть получено при необходимости. другими частями кода.
Вызвать указанную форму.
Нравится:
Calling parent
----------
public MyForm f {get;set;}
void DoStuff()
{
f = new MyForm();
f.Show();
}
MyForm
----------
void DoOtherStuff()
{
this.hide();
}
Parent
----------
void UnHideForm()
{
f.show();
}