如何处理几个窗体

时间:2012-05-31 08:15:33

标签: c# winforms

我正在做一个小型项目来存储电影。我正在使用三种窗体形式,一种介绍形式,一种主要形式和一种新的电影形式。我还有一个我称之为MovieManager的类,它是应用程序的核心。我的问题是,我不确定如何处理这个窗口。

假设我希望应用程序以介绍形式开头,当用户单击“确定”按钮时,应显示主窗体。做这个的最好方式是什么?我应该在Program.cs中创建一个MovieManager类的对象来显示和隐藏不同的窗体,还是我应该在Program.cs中首先显示介绍形式?

3 个答案:

答案 0 :(得分:2)

启动应用程序时,您可以在Program.cs中完成所有工作。将IntroForm显示为对话框。如果用户单击“确定”,则启动主申请表,否则关闭申请。

static void Main()
{
    IntroForm introForm = new IntroForm();
    if (introForm.ShowDialog() != DialogResult.OK)
    {
        Application.Exit();
        return;

    }

    Application.Run(new MainForm());
}

如果您需要单个MovieManager实例用于所有这些表单,则可以在Main方法中创建它并将相同的实例传递给IntroFormMainForm

MovieManager movieManager = new MovieManager();

IntroForm introForm = new IntroForm(movieManager);
if (introForm.ShowDialog() != DialogResult.OK)
{
    Application.Exit();
    return;
}

Application.Run(new MainForm(movieManager));

此外,您可以将MovieManager实施为Singleton,可通过静态属性MovieManager.Instance随处访问。

答案 1 :(得分:1)

你称之为简介形式,我应该称之为启动画面。在program.cs中,我应该弹出启动画面(带有关于应用程序的标识,标题和信息,版本号等)。启动画面会显示一段时间(使用计时器,或者Thread.Sleep也可能有点重)。

当启动画面关闭时,显示MainForm从那里显示a,你可以实例化MovieManager或使用静态MovieManager(它取决于它的用途)。然后,您可以从mainform实例化并显示新的电影表单。

我们使用这样的代码:

static void Main(string[] args)
{
  try
  {
    SplashScreen.ShowSplashScreen();
    Application.DoEvents();
    SplashScreen.WaitForVisibility(.5);
    bool starting = true;
    while (starting)
    {
      try
      {
        SplashScreen.SetStatus("Initialize mainform...");
        starting = false;
        Application.Run(new MainForm());
      }
      catch (Exception ex)
      {
        if (starting)
          starting = XtraMessageBox.Show(ex.Message, "Fout bij initialiseren", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1) == DialogResult.Retry;
        else
          throw (ex);
      }
    }
  }
  catch (Exception ex)
  {
    if (ex is object)
      XtraMessageBox.Show(ex.Message, "Algemene fout", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
  }
}

启动画面中的代码(摘录)如下所示:

if (_splashForm == null)
{
  ThreadPool.QueueUserWorkItem(RunSplashForm, null);
  while (_splashForm == null || _splashForm.IsHandleCreated == false)
  {
    System.Threading.Thread.Sleep(50);
  }
}

也许这些链接也会为您提供一些有用的信息:

http://www.reflectionit.nl/Articles/Splash.aspx

我们用它作为我们自己代码的基础:

http://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C

答案 2 :(得分:0)

有不同的方式来展示新表格。您可以首先使用MdiWinForm,您必须将IsMdiContainer属性更改为true,然后在MainForm中使用这些代码:

  Form2 f2;    

private void button1_Click(object sender, EventArgs e)
{
    if (f2 == null) {
       f2 = new Form2();
       f2.MdiParent = this;
       f2.FormClosed += delegate { f2 = null; };
       f2.Show();
    }
    else {
       f2.Activate();
    }
}