Ich möchte eine alte Terminal-Emulation erstellen. Das Erstellen von Befehlen scheint einfach zu sein, aber ich möchte dem Benutzer eine sehr vintage UI-Benutzeroberfläche bieten.
Ich möchte in der Lage sein, Text auf die Konsole zu drucken, z. B. "Logs", und wenn der Benutzer eine Pfeiltaste drückt, soll sie hervorgehoben werden und sobald sie ausgewählt ist, möchte ich die ausgewählte Befehl mit der Eingabetaste ausführen können.
Ich verwende übrigens Visual Studio Express 2012 für Desktop.
Antworten
Zu viele Anzeigen?Ich glaube, du wirst die Zeilen, die du bereits auf dem Bildschirm platziert hast, neu schreiben müssen, um ihre Farbe und Hintergrund als Reaktion auf Pfeileingaben zu ändern
Ich denke, du wirst in der Lage sein, zu benutzen
Console.SetCursorPosition
um den Cursor wieder auf die Zeile zu setzen, deren Farbe du ändern möchtest und dann
Console.BackgroundColor
Console.ForegroundColor
Console.ResetColor()
um die Farben dessen zu ändern, was du schreibst
Im Grunde genommen musst du also
- den Bildschirm löschen, wenn du startest, um die Positionen jeder Option zu kennen
- auf magische Tastendrücke reagieren
- die Farbe/Hintergrund des Elements ändern, das dein magischer Tastendruck hervorhebt
Vergiss nicht, den Cursor nach dem Neu-Schreiben des hervorgehobenen Teils wieder an seine Originalposition zu setzen. Dies ist ein grobes Beispiel, um zu verdeutlichen, was ich meine.
Console.Clear();
Console.WriteLine("Option 1");
Console.WriteLine("Option 2");
Console.WriteLine("Option 3");
Console.WriteLine();
Console.Write("Eingabe: ");
var originalpos = Console.CursorTop;
var k = Console.ReadKey();
var i = 2;
while (k.KeyChar != 'q')
{
if (k.Key == ConsoleKey.UpArrow)
{
Console.SetCursorPosition(0, Console.CursorTop - i);
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.White;
Console.WriteLine("Option " + (Console.CursorTop + 1));
Console.ResetColor();
i++;
}
Console.SetCursorPosition(8, originalpos);
k = Console.ReadKey();
}
Ich denke, es könnte einfacher sein, eine Routine zu erstellen, die alle notwendigen Texte auf dem Bildschirm ausgibt und den gesamten Text jedes Mal neu schreibt, wenn der Benutzer eine magische Taste drückt, während er hervorhebt.
Ich habe nach demselben gesucht, also habe ich es selbst erstellt. Ich habe das Hervorheben durch Umkehren der Farbe des Vorder- und Hintergrunds emuliert.
Es verwendet die Pfeiltasten, um die Optionen zu navigieren, der Cursor ist auch auf unsichtbar eingestellt, um es schön aussehen zu lassen.
class Program
{
static int win_W;
static int win_H;
static void Main(string[] args)
{
Boolean running = true;
win_W = Console.WindowWidth;
win_H = Console.WindowHeight;
Console.CursorVisible = false;
int slct = 0;
// int1 ist posX, int2 ist posY, string ist der Text, den Sie als Option anzeigen möchten, und Boolean zeigt an, ob es ausgewählt ist
List> opts = new List>
{
new Tuple((win_W/2)-4, (win_H / 2) - 5, "OPTION 1", true),
new Tuple((win_W/2)-4, (win_H / 2) - 4, "OPTION 2", false),
new Tuple((win_W/2)-4, (win_H / 2) - 3, "OPTION 3", false),
};
while (running == true)
{
foreach (Tuple tupe in opts)
{
if (tupe.Item4 == true)
{
//setzt die Variable 'slct' gleich dem Index des Tupelwerts mit dem true-Wert
slct = opts.FindIndex(t => t.Item3 == tupe.Item3);
Console.SetCursorPosition(tupe.Item1, tupe.Item2);
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.White;
Console.Write(tupe.Item3);
}
else if (tupe.Item4 == false)
{
Console.SetCursorPosition(tupe.Item1, tupe.Item2);
Console.ForegroundColor = ConsoleColor.White;
Console.BackgroundColor = ConsoleColor.Black;
Console.Write(tupe.Item3);
}
}
//Seltsamer Fehler, wenn Sie dies herausnehmen
Console.SetCursorPosition(opts[2].Item1 + 1, opts[2].Item2);
Console.ForegroundColor = ConsoleColor.White;
Console.BackgroundColor = ConsoleColor.Black;
Console.Write("");
//Ein kleines Fragezeichen erscheint auf der unteren Option, wenn Sie Escape drücken
//Und wenn Sie von Option 3 zu Option 2 gehen, bleibt ein Block rechts markiert
string inp = Console.ReadKey().Key.ToString();
if (inp == "UpArrow" && slct > 0)
{
opts[slct] = new Tuple(opts[slct].Item1, opts[slct].Item2, opts[slct].Item3, false);
slct -= 1;
opts[slct] = new Tuple(opts[slct].Item1, opts[slct].Item2, opts[slct].Item3, true);
}
else if (inp == "DownArrow" && slct < 2)
{
opts[slct] = new Tuple(opts[slct].Item1, opts[slct].Item2, opts[slct].Item3, false);
slct += 1;
opts[slct] = new Tuple(opts[slct].Item1, opts[slct].Item2, opts[slct].Item3, true);
}
}
}
}