【问题标题】:How to handle several windows form如何处理多个窗体
【发布时间】:2012-05-31 08:15:32
【问题描述】:

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

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

【问题讨论】:

  • 这取决于你,无论用户最需要什么 - 我猜先显示。
  • 我想从介绍表单开始,但我只是想知道我应该从不是表单的 MovieManager 开始,还是应该从 intr 表单开始。如果我从 Moviemanager 开始,我的想法是是否可以从那里控制所有表单的可见性?

标签: c# winforms


【解决方案1】:

您可以在启动应用程序时简单地在 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 在任何地方访问。

【讨论】:

  • 我正在测试您回答中的第一个替代方案。我在 IntroForm 中有一个确定按钮,但是当我单击它时没有任何反应?
  • 选择您的确定按钮并在属性窗口中将DialogResult 属性设置为OK。或者您可以在此按钮的单击事件处理程序上手动设置 IntroForm 的 DialogResult 属性。
  • 有没有一种简单的方法可以让每个表单居中?
  • 是的,有一个属性StartPosition的form。您可以将其设置为CenterScreen
  • 当我点击 MainForm 中的一个按钮来创建一个对象并显示 MovieForm 时,这还不够吗: MovieForm movieForm = new MovieForm(); ??
【解决方案2】:

你所说的介绍表单,我应该称之为启动屏幕。在 program.cs 中,我应该只弹出启动画面(带有徽标、标题和有关应用程序的信息、版本号等)。启动画面会显示一段时间(为此使用计时器,或者 Thread.Sleep 也可能有点重)。

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

我们使用这样一段代码:

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

【讨论】:

    【解决方案3】:

    显示新表单的方式有多种。您可以先使用 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 2017-03-22
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多