控制台停止运行脚本的其余部分

时间:2020-08-21 15:41:38

标签: c# visual-studio

所以我有2个表单和一个控制台,该控制台是通过第二种形式的函数Start()启动的。

    public void Start()
        {
            Console.Title = "RPG";
            strength.Visible = true;
            dexterity.Visible = true;
            constitution.Visible = true;
            intelligence.Visible = true;
            wisdom.Visible = true;
            charisma.Visible = true;
            Console.Clear();
            string race;
            Console.WriteLine("Welcome!");
            Console.WriteLine("Please press 'Enter' to continue.");
            Console.ReadLine();
            Console.WriteLine("This is a world divided by Race, War and Gods...");
            Console.WriteLine("Since the days of old, conflict was common and War was eternal");
            Console.WriteLine("Please press 'Enter' to continue.");
            Console.ReadLine();
            Console.WriteLine("What race do you wish to be?");
            Console.WriteLine("_____________________________");
            Console.WriteLine("(1) Human \n(2) Elf \n(3) Dwarf");
            Console.WriteLine("_____________________________");
            Console.WriteLine("(4) Faun \n(5) Orc \n(6) Aswang \n");
            Console.Write("Choice: ");
            race = Console.ReadLine().ToLower();
            switch (race)
            {
                case "1":
                case "human":
                    Console.WriteLine("\nHumans are native to the rolling hills of Interit");
                    Console.WriteLine("Please press 'Enter' to continue.");
                    Console.ReadLine();
                    First();
                    break;

                case "2":
                case "elf":
                    Console.WriteLine("\nElves are native to the forests of Abrines");
                    Console.WriteLine("Please press 'Enter' to continue.");
                    Console.ReadLine();
                    First();
                    break;

                case "3":
                case "dwarf":
                    Console.WriteLine("\nDwarves are native to the rocky regions of Dunfall");
                    Console.WriteLine("Please press 'Enter' to continue.");
                    Console.ReadLine();
                    First();
                    break;

                case "4":
                case "faun":
                    Console.WriteLine("\nFaun serve in the Ashlands of Ethana");
                    Console.WriteLine("Please press 'Enter' to continue.");
                    Console.ReadLine();
                    First();
                    break;

                case "5":
                case "orc":
                    Console.WriteLine("\nOrcs serve in the country of Ocrain");
                    Console.WriteLine("Please press 'Enter' to continue.");
                    Console.ReadLine();
                    First();
                    break;

                case "6":
                case "aswang":
                    Console.WriteLine("\nAswang serve in the Weytane Woodlands");
                    Console.WriteLine("Please press 'Enter' to continue.");
                    Console.ReadLine();
                    First();
                    break;

                default:
                    Console.WriteLine("Invalid option!");
                    Console.WriteLine("Please press 'Enter' to continue.");
                    Console.ReadLine();
                    Start();
                    break; 
            }

在单击继续按钮后,将从第一个表单中调用此函数,然后将第一个表单的可见性设置为false。 Main()函数如下所示,并且与Start()函数位于同一脚本中。

public void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form2 form2 = new Form2();
            Form1 form1 = new Form1();
            form2.Hide();
            Application.Run(form1);
        }

我的问题是,一旦调用Start(),就无法关闭,移动,最小化,最大化等形式。我发现这是由于控制台的原因,但是我在网上找不到任何有关如何单独运行控制台,以免干扰表单。有什么想法吗?

编辑:我应该补充一点,它作为控制台应用程序启动,这使控制台在运行时出现。

3 个答案:

答案 0 :(得分:1)

在对问题的一些评论中,提到您不应在同一应用程序中混合使用控制台交互和Windows窗体(或其他GUI)交互。有一个重要的原因需要理解。

每个Windows程序都有一个循环,在该循环中它接收输入事件并将其发送以进行处理。在Windows Forms应用程序中,这很明显,因为您编写了处理程序来响应输入事件。在控制台应用程序中,事件循环仍然存在,但对您而言是隐藏的。当您处于“控制台读取”状态时,控制台会收集输入事件以汇编字符串,并在响应“ Enter”输入事件时将其返回给您。 (请注意,模态形式以类似于控制台的方式接管事件循环)。

要获得还具有响应表单的控制台类型的应用程序,您可能想要创建自己的“ Console”类,该类是具有显示区域和输入区域的Windows窗体。这样,您可以让常规Windows事件循环处理所有事情。您将不得不以更加复杂的方式处理输入:而不是仅在控制台上等待。在程序的特定位置阅读,您将必须保持 跟踪用户在按Enter键(或提交按钮等)时期望的输入类型。

答案 1 :(得分:0)

我从事表格工作已经很久了,所以带一点盐....

您提到隐藏了Form1。如果Form1是模式的,它将阻止Form2接受输入。要进行实验,请不要隐藏Form1,看看关闭它是否可以解决问题。如果是,则将模式属性更改为false。

答案 2 :(得分:0)

尝试在不同的任务中同时运行这两个/全部

    class Settings
    {
        public bool ShowConsole { get; set; }
        public bool ShutDown { get; set; }
        // Other staff
    }

    static Settings settings = new Settings();

    public static void Main()
    {
        var forms = Task.Run(() =>
        {
            // After Btn Click 
            settings.ShowConsole = true;

            // Or 
            settings.ShutDown = true;
        });
        var console = Task.Run(() =>
        {
            while (!settings.ShutDown) 
            {
                if (settings.ShowConsole)
                {
                    // Show
                    settings.ShowConsole = false;
                }
                else
                {
                    // Hide
                }
            }
        });
        Task.WaitAll(forms, console);
    }