Wie emuliert man eine Konsole in WPF?

8

Ich möchte ein paar Tipps in die richtige Richtung oder sogar fertige Lösungen für dieses Problem und ich bin ziemlich fest (ich bin nur Anfänger / Mittelstufe):

Ich versuche ein SSH in meiner Anwendung zu implementieren. Das SSH-Backend funktioniert gut und so, aber ich stecke am Frontend fest. Welche WPF-Kombination würde mir eine adäquate Lösung bieten, um eine Konsole zu emulieren? Legen Sie eine komplette Terminal-Emulation beiseite, ich würde mich freuen, einfach Line / Line in etwas zu lesen, das wie eine Konsole aussieht: -)

Mein bester Ansatz war bisher ein 80x50 Raster aus einzelnen Zeichen, was zu 4000 einzelnen Zellen führte und das fühlt sich an wie ein totaler Overkill.

Eine andere Idee war, eine Konsole-Appl. gebunden an ein wpf-Fenster in einem anderen Projekt. Aber ... ist das überhaupt möglich und wie?

    
FrankyTheDumb 19.02.2013, 01:08
quelle

3 Antworten

28

Wenn Sie eine Konsole emulieren wollen, würde ich das so machen. Beachten Sie, dass Sie die Befehle behandeln und die Ergebnisse selbst ausgeben müssen.

page.xaml

%Vor%

page.xaml.cs

%Vor%     
ZombieSheep 19.02.2013, 12:27
quelle
3

Wussten Sie, dass Sie mit AllocConsole ein Konsolenfenster aus Ihrer Anwendung anzeigen können?

  

Dies ist eine einfache Möglichkeit, eine "Dual-Mode" -Anwendung zu erstellen   Konsolen- oder Windows-Formularanwendung.

%Vor%

Oder Sie können dies verwenden:

%Vor%

Ersetzen Sie zum besseren Aussehen den TextBlock durch eine ListBox und formatieren Sie die ItemTemplate entsprechend.

    
animaonline 19.02.2013 11:35
quelle
0

Ich habe es selbst nicht gemacht, aber es ist eines meiner "Ich mache es, wenn ich Zeit habe" -Projekte. Daher suche ich noch nach einer bestehenden Implementierung :-P

Irgendwie ein paar Gedanken:

Die Verwendung von Visuals (d. h. Ellipsen, Textblöcke) ist wahrscheinlich keine gute Idee. Denken Sie nur darüber nach, was passieren soll, wenn Sie 200x100 Zeichen haben möchten. Vielleicht sogar ein Backbuffer. Alles im Speicher halten + es zeichnen .... es wird unglaublich langsam sein.

Daher ist der bessere (oder sogar richtige) Ansatz, sich selbst zu zeichnen. Da WPF backbuffered ist und Sie keine willkürliche Bitmap anzeigen möchten, wäre der am meisten geeignete Ansatz, ein neues UserControl zu erstellen und seine Paint-Methode zu überschreiben. Sie ziehen es vor, von Control ableiten, aber UserControl möglicherweise Inhalte, so dass Sie so etwas wie ein Verbindungsindikator-Symbol im Inneren zeigen können.

Architektonisch würde ich vorschlagen, eine Abhängigkeitseigenschaft Puffer ( ConsoleBuffer ) zu erstellen, die das Konsolenpuffermodell enthält. Ein anderer DP würde die Position oben links Standort ( long ) halten. Es bestimmt, wo die Anzeige gestartet wird (während Sie einen Blick darauf werfen). Das Konsolenmodell würde ich eine Klasse machen, die eine char[] und eine Color[] (eindimensional) enthält. Verwenden Sie Zeilenumbrüche und \n -Zeichen, um Zeilen zu erstellen (weil dies das Zeichen einer Konsole ist). Wenn Sie dann die Größe des Steuerelements ändern, wird es erneut fließen, ohne dass der Puffer neu zugewiesen werden muss. Sie können mit ** ConsoleBuffer ** s verschiedener Größe (für eine andere Anzahl von Look-Back-Zeichen) arbeiten.

ConsoleBuffer.Write(string s) ist Ihre Methode, um Dinge zu tun.

Vielleicht ist es ratsam, Arrays von Arrays char[][] zu halten, um Linien darzustellen .... aber das ist beim Programmieren herauszufinden.

    
Robetto 20.08.2014 16:49
quelle

Tags und Links