所以我有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(),就无法关闭,移动,最小化,最大化等形式。我发现这是由于控制台的原因,但是我在网上找不到任何有关如何单独运行控制台,以免干扰表单。有什么想法吗?
编辑:我应该补充一点,它作为控制台应用程序启动,这使控制台在运行时出现。
答案 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);
}