Показ скрытой формы

Как я показываю от того, которые были скрыты с помощью

this.Hide();

Я попробовал

MainMenuForm.Show();

и это просто говорит, что мне нужен объект касательно, Я затем попробовал:

MainMenuForm frmMainMenu = new MainMenuForm();
frmMainMenu.Show();

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

Просто для уточнения MainMenuForm является формой запуска. Когда (например), Опция 1 нажата, MainMenuForm затем прячется при открытии формы Опции 1. То, что я хотел бы знать, - то, как я заставляю Опцию 1 сформировать это, MainMenuForm открывается, "раскрывают" MainMenuForm и затем закрывают себя.

Какова корректная процедура здесь?

Заранее спасибо.

10
задан Arcadian 9 June 2010 в 12:52
поделиться

5 ответов

Когда вы делаете следующее:

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 .

20
ответ дан 3 December 2019 в 16:51
поделиться

Сохраните ссылку на форму и вызовите для нее .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.

0
ответ дан 3 December 2019 в 16:51
поделиться

Самый простой и легкий способ - использовать LINQ и изучить свойство Application.OpenForms . Я предполагаю, что у вас есть только 1 экземпляр формы (надеюсь!), В противном случае убедитесь, что у скрытой формы есть какое-то общедоступное свойство, чтобы иметь возможность различать ее.

Следующий код откроет для вас скрытие формы:

var formToShow = Application.OpenForms.Cast<Form>()
    .FirstOrDefault(c => c is MainMenuForm);
if (formToShow != null)
{
    formToShow.Show();
}
3
ответ дан 3 December 2019 в 16:51
поделиться

Вам нужно сохранить ссылку на первую форму при ее создании, а затем код, содержащий эту ссылку, может вызвать для нее Show .

Если вы не открываете эту форму откуда-то, но она настроена как форма запуска, вам нужно либо изменить ее, чтобы у вас был метод Main, который открывает эту форму, либо вы можете сохранить в этой форме ссылку на себя. где-нибудь, к которому можно получить доступ из других мест.

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

1
ответ дан 3 December 2019 в 16:51
поделиться

Вызвать указанную форму.

Нравится:

Calling parent
----------
public MyForm f {get;set;}

void DoStuff()
{
f = new MyForm();
f.Show();
}

MyForm
----------
void DoOtherStuff()
{
this.hide();
}

Parent
----------
void UnHideForm()
{
f.show();
}
0
ответ дан 3 December 2019 в 16:51
поделиться
Другие вопросы по тегам:

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