4 Stimmen

Wie man Text in der C#-Konsole hervorhebt und auswählt

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.

4voto

stombeur Punkte 2682

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.

1voto

Atzin Punkte 125

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);
            }
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X