在C#中创建表单的多个实例(并将其保留在那里)

时间:2016-03-19 06:22:08

标签: c#

非常 C#的新手,我正在尝试创建一个Windows窗体应用程序,它将创建相同窗体的多个实例并保持它们的存在,并结束他们都在某个按键上。现在,我在保持所述表格自动关闭方面遇到了一些困难。由于我是c#的新手,我不知道为什么。我也不知道在哪里寻找这样的问题,所以这个问题可能是重复的。到目前为止,这是我的(可能是严格屠杀的)主要代码(来自主文件,在本例中为Program.cs):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Input;

namespace WindowsFormProgram1
{


    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        /// 
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);


            for (int i = 0; i < 15; i++)
            {
                new Form1().Show();
                Thread.Sleep(100);
            }        
        }
    }
}

任何答案都会受到重视。正如我之前提到的,我对C#只有基本的了解,这可能只是重复。

1 个答案:

答案 0 :(得分:4)

问题是因为您的代码比您想象的更早结束。

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    for (int i = 0; i < 15; i++)
    {
        new Form1().Show();
        Thread.Sleep(100);
    }
    // code exit's here, thus closing all forms created.
}

为此,您可以在最后添加Application.Run()调用,这将导致主线程等到指定的ApplicationContext退出;在大多数情况下,上下文是一个表单,如在Application.Run(new Form1());中,您只需要记住主线程将阻塞(即不继续)直到Application.Run返回。所以你可以修改你的代码:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    for (int i = 0; i < 14; i++) // <- note 14
    {
        new Form1().Show(); // will show the form
        Thread.Sleep(100);
    }
    // This will show the form and block until the form is closed
    Application.Run(new Form1());
}

此外,由于您想在按下某个键时关闭所有表单,您可以执行以下操作:

public static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    for (int i = 0; i < 15; i++) {
        Form1 f = new Form1();
        f.KeyPress += new KeyPressEventHandler(f_KeyPress);
        f.Show();
    }
    // Note, no `new Form1()`; this will block until Exit is called.
    Application.Run();
}

static void f_KeyPress(object sender, KeyPressEventArgs e)
{
    // This will exit when ANY key is pressed on ANY form
    Application.Exit();
}

这些只是实现您想要的几种方法,还有Form.ShowDialog方法,但由于您只是在学习,我还会留下其他实施细节给你。

  

我也不知道在哪里寻找像这样的问题

.NET Framework Development Guide有很多关于从哪里开始以及如何继续的信息,以及关于.NET库的MSDN文档是当您对此感到好奇时使用的参考.NET类/函数的语法或操作。还有Visual Studio中的Object Browser,可以让您查看一些简短的文档。

希望这可以提供帮助。