显示隐藏的表格

时间:2010-06-09 12:26:52

标签: c# winforms

如何显示使用

隐藏的内容
this.Hide();

我试过了

MainMenuForm.Show();

这只是说我需要一个对象引用。然后我尝试了:

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

这似乎表明了适当的形式。但是当你退出应用程序时,它仍然保留在内存中,因为它没有显示隐藏的表单,而是显示了表单的新版本。实际上有2个表格实例(一个隐藏,一个可见)。

为了澄清,MainMenuForm是启动形式。单击(例如)单击选项1时,MainMenuForm会在打开选项1表单时隐藏自身。我想知道的是如何制作MainMenuForm打开的选项1表单“取消隐藏”MainMenuForm然后自行关闭。

这里的正确程序是什么?

提前致谢。

7 个答案:

答案 0 :(得分:20)

执行以下操作时:

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 Pattern(感谢链接的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

答案 1 :(得分:2)

最简单,最简单的方法是使用LINQ并查看Application.OpenForms属性。我假设你只有一个表格实例(希望如此!),否则一定要在隐藏表格上有一些公共财产才能区分它。

以下代码将为您取消隐藏表单:

var formToShow = Application.OpenForms.Cast<Form>()
    .FirstOrDefault(c => c is MainMenuForm);
if (formToShow != null)
{
    formToShow.Show();
}

答案 2 :(得分:1)

您需要在创建第一个表单时保留对第一个表单的引用,然后保存该表单的代码可以在其上调用Show

如果您没有从某个地方打开该表单但是它被设置为启动表单,那么您需要更改它以便您有一个打开该表单的Main方法,或者您可以让该表单存储对自身的引用可以从其他地方访问的地方。

例如,一种快速而丑陋的方法是,向主窗体添加公共静态属性,然后当您隐藏窗体时,它还会将this写入该属性,然后在需要时可以检索该属性部分代码。

答案 3 :(得分:1)

实际上这对我有用....

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

通过按钮点击事件调用它。

private void buttonclick()
{
    if (_mainMenuForm.Visible)
    {
         _mainMenuForm.Visible = false;
    }
    else
    {
         _mainMenuForm.Visible = true;
    }
}

答案 4 :(得分:0)

调用引用的表单。

像:

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

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

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

Parent
----------
void UnHideForm()
{
f.show();
}

答案 5 :(得分:0)

存储对表单的引用,并在其上调用.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的表单。

答案 6 :(得分:-1)

另一个更简单的方法是循环打开表单,看看哪些仍在运行并打开它......

foreach (Form oForm in Application.OpenForms)
{
   if (oForm is MainMenuForm)
   {
      oForm.Show();
      break;
   }
}