我想在控制檯應用程序中創建輸入和輸出節。我需要完成的結果看起來像這樣:http://i.imgur.com/H2lpRor.jpgC#移動Console.ReadLine()的位置
我該如何去創造這個或甚至可能?這需要成爲一個控制檯應用程序。另外,我將如何去清理Console.ReadLine()所在的區域?
我想在控制檯應用程序中創建輸入和輸出節。我需要完成的結果看起來像這樣:http://i.imgur.com/H2lpRor.jpgC#移動Console.ReadLine()的位置
我該如何去創造這個或甚至可能?這需要成爲一個控制檯應用程序。另外,我將如何去清理Console.ReadLine()所在的區域?
是的,它有可能,你可以在CursorPosition設置爲在屏幕任意位置,然後將其設置回底部輸入
Console.SetCursorPosition(Console.WindowLeft, Console.WindowBottom);
可能-1底部
你的方法有些不正確。您在操作舊版DOS控制檯方面缺乏經驗,並且注意使用內置函數,忘記了Console是基於流的,並且可以手動操作。
當您需要實現自己的文本輸入佈局時,您需要關掉內置的行讀取方法並切換到手動流操作。值得慶幸的是,.NET讓事情變得比在老式的COM中更容易。
例如,您可以從以下代碼開始,將代碼移動到文本輸入並將輸出管理爲五行。當然,它遠非完美(無限循環...靜態變量......呃,對我很恥辱),但我會以原始形式讓它變得更簡單。
爲了將它變成多線程應用程序,您需要使「輸出」線程安全(有很多方法可以實現)並更改Foo()的內容(目前它只是回聲)。
class Program
{
static List<string> output = new List<string>();
static int maxlines = 5;
static void Foo(string s)
{
// echo
output.Add(s);
while (output.Count>maxlines)
{
output.RemoveAt(0);
}
}
static void Main(string[] args)
{
string s = "";
while (true)
{
if (Console.KeyAvailable)
{
char c = Console.ReadKey(true).KeyChar;
switch (c)
{
case '\r': Foo(s); s = ""; break;
case '\b': if (s.Length > 0) { s = s.Remove(s.Length - 1); } break;
default: s += c; break;
}
// some clearing
Console.SetCursorPosition(Console.WindowLeft, 6);
Console.Write(" ");
// and write current "buffer"
Console.SetCursorPosition(Console.WindowLeft, 6);
Console.Write(s);
}
// now lets handle our "output stream"
for (int i = 0; i < Math.Min(maxlines, output.Count); i++)
{
Console.SetCursorPosition(Console.WindowLeft, i);
Console.Write(output[i].PadRight(32));
}
}
}
}
嗯謝謝你,我會在一會兒嘗試一下,有一件事我忘記提到了,我該如何去清理那個區域? – Brodie
如果你可以把光標放在任何地方,並在任何地方寫任何東西,我相信你可以弄清楚如何清除東西:) –
我會給它一個鏡頭,謝謝 – Brodie