Отображение скрытой формы - PullRequest
9 голосов
/ 09 июня 2010

Как мне показать, что было скрыто с помощью

this.Hide();

Я пробовал

MainMenuForm.Show();

, и это просто говорит, что мне нужен объект ref.Затем я попытался:

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

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

Просто для пояснения, MainMenuForm является формой запуска.При щелчке (например) по варианту 1 MainMenuForm скрывается, открывая форму варианта 1.Что я хотел бы знать, так это как мне сделать форму Варианта 1, чтобы MainMenuForm открывала «unhide» MainMenuForm, а затем закрывала себя..

Ответы [ 7 ]

20 голосов
/ 09 июня 2010

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

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

UPDATE:

Просто прочитайте, что MainMenuForm это ваша форма запуска. Реализуйте класс, похожий на мой пример синглтона выше, а затем измените свой код на следующий в файле Program.cs вашего приложения:

Application.Run(FormProvider.MainMenu);

Затем вы можете получить доступ к MainMenuForm из любой точки вашего приложения через класс FormProvider.

3 голосов
/ 09 июня 2010

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

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

var formToShow = Application.OpenForms.Cast<Form>()
    .FirstOrDefault(c => c is MainMenuForm);
if (formToShow != null)
{
    formToShow.Show();
}
1 голос
/ 03 сентября 2014

Практически это работает для меня ....

public class MainWindow : Form
{
    Form _mainMenuForm = new MainMenuForm();
}

вызов через событие нажатия кнопки.

private void buttonclick()
{
    if (_mainMenuForm.Visible)
    {
         _mainMenuForm.Visible = false;
    }
    else
    {
         _mainMenuForm.Visible = true;
    }
}
1 голос
/ 09 июня 2010

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

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

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

0 голосов
/ 25 марта 2014

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

foreach (Form oForm in Application.OpenForms)
{
   if (oForm is MainMenuForm)
   {
      oForm.Show();
      break;
   }
}
0 голосов
/ 09 июня 2010

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

Позвоните по ссылочной форме.

Как:

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

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

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

Parent
----------
void UnHideForm()
{
f.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...