显示隐藏的表单

问题描述 投票:10回答:8

我如何显示已被使用隐藏的内容

this.Hide();

我已经尝试过

MainMenuForm.Show();

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

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

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

仅说明一下,MainMenuForm是启动表单。当(例如)单击选项1时,MainMenuForm然后在打开“选项1”窗体时隐藏自身。我想知道的是,如何使Option 1表单的MainMenuForm打开“取消隐藏” MainMenuForm,然后关闭自身。

这里正确的程序是什么?

提前感谢。

c# winforms
8个回答
20
投票

当您执行以下操作时:

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

您正在创建并显示MainMenuForm的new实例。

为了显示和隐藏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();
   }
}

UPDATE:

只需阅读MainMenuForm是您的启动表格。实现一个类似于上面的单例示例的类,然后在应用程序的Program.cs文件中将代码更改为以下代码:

Application.Run(FormProvider.MainMenu);

然后您可以通过MainMenuForm类从应用程序中的任何位置访问FormProvider


3
投票

最简单的方法是使用LINQ并查看Application.OpenForms属性。我假设您只有一个表单实例(希望如此!),否则请确保在隐藏表单上必须具有一些公共属性才能区分它。

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

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

1
投票

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

如果您没有从某个地方打开该表单,而是将其设置为启动表单,那么您要么需要对其进行更改,以使您拥有可以打开该表单的Main方法,也可以让该表单在某个地方存储对自身的引用可以从其他地方访问。

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


1
投票

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

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

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

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

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的窗体。


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

0
投票

@ RunninThruLife

我无法投票,但是您的解决方案对我有用。


-1
投票

另一种实现此目的的简单方法是遍历打开的窗体以查看哪些窗体仍在运行并打开它...

foreach (Form oForm in Application.OpenForms)
{
   if (oForm is MainMenuForm)
   {
      oForm.Show();
      break;
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.