VT100-Terminal-Emulation in Windows -, WPF-oder Silverlight
Bin ich am grübeln erstellen einer WPF-oder Silverlight-app, die funktioniert wie ein terminal-Fenster. Außer, da ist es in WPF/Silverlight, wird es in der Lage sein, zu 'verbessern' die terminal-Erfahrung mit Effekten, Bilder, etc.
Ich versuche, herauszufinden, der beste Weg, Sie zu emulieren ein terminal. Ich weiß, wie behandeln die VT100-emulation so weit, wie das Parsen, etc. Aber wie kann man ihn anzeigen? Als ich mit einem RichTextBox-Steuerelement, und im wesentlichen die Umwandlung der VT100-escape-codes in RTF.
Das problem, das ich sehe, ist die Leistung. Das terminal kann immer nur ein paar Zeichen in einer Zeit, und laden Sie Sie in das textbox-wie-wir-gehen würde ich ständig erstellen TextRanges und Load() zum laden der RTF. Auch, um für jede be - 'Sitzung' um vollständig zu sein, es vollständig zu beschreiben RTF. Zum Beispiel, wenn die aktuelle Farbe Rot ist, jeden laden in der TextBox müssten die RTF-codes, um den text rot, oder ich davon ausgehen, das RTB wird nicht geladen als rot.
Das scheint mir sehr überflüssig -- das erzeugte RTF-Dokument gebaut, durch die emulation wird sehr chaotisch. Auch die Bewegung des Cursors scheint nicht so, als wäre es im Idealfall werden von der RTB. Ich brauche etwas, custom, dünkt mich, aber das macht mir Angst!
In der Hoffnung zu hören, Ideen oder Hinweise zu bestehenden Lösungen. Gibt es vielleicht eine Möglichkeit zum einbetten von einer tatsächlichen terminal-und overlay-Zeug oben drauf. Das einzige, was ich gefunden habe ist eine alte WinForms-Steuerelement.
UPDATE: Sehen, wie die vorgeschlagene Lösung schlägt wegen dir in meiner Antwort weiter unten. 🙁
VT100-Terminal-Emulation in Windows -, WPF-oder Silverlight
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einzige Weg, um text effektiv ist die Verwendung TextFormatter.
Ich habe implementierte telnet-client für text-based RPG Spiele und es funktioniert ziemlich gut.
Sie können überprüfen, Quellen zur http://mudclient.codeplex.com
Ich verstehe nicht, warum Sie würde sich ernsthafte sorgen über die RTF immer komplexer. Ja, es wird. Aber es ist nicht deine Last mit ihm zu beschäftigen, ein Microsoft-Programmierer haben, dass vor einer Weile, dass Sie schreiben Sie den code zum Rendern gewundenen RTF. Es funktioniert gut und ist völlig undurchsichtig, um Sie.
Ja, es ist nicht super-schnell. Aber was die hey, du bist emuliert einen 80x25-Anzeige, die verwendet werden, um laufen auf 9600 baud. Vollständig ersetzen Sie die Steuerung, um zu versuchen, um es optimal macht wenig Sinn und wird ein großes Unterfangen.
Gut, um Bericht zu meinem status, ich habe festgestellt, dass dies ist nicht wirklich möglich mit WPF oder Silverlight.
Das problem mit dem vorgeschlagenen Vorgehen ist, dass es 80*24 TextBlocks, sowie einige andere Elemente, mit mehreren Bindungen für forecolor, backcolor, etc. Wenn der Bildschirm braucht, um zu Blättern, jede dieser Bindungen müssen neu bewertet werden, und es ist sehr, sehr langsam. Aktualisieren Sie den gesamten Bildschirm dauert ein paar Sekunden. In meiner app ist das nicht akzeptabel, der Bildschirm wird ständig scrollen.
Ich habe versucht, viele verschiedene Dinge zu optimieren. Ich habe einmal versucht, einen textblock mit der 80 läuft jeweils pro Zeile. Ich habe versucht, die Dosierung der Benachrichtigungen ändern. Ich habe versucht, es so zu machen eine 'Blättern' - Ereignis manuell aktualisiert werden, jeder textblock. Nichts hilft wirklich -- der langsame Teil ist die Aktualisierung der Benutzeroberfläche, nicht die Art, wie es gemacht wird.
Eine Sache, die geholfen hätten, wenn ich entwickelt einen Mechanismus, nicht um einen textblock, oder führen Sie für jede Zelle, aber nur zu ändern, Textblöcke, wenn der Stil des Texts ändert. Also einen string der gleichen-Farbe-text zum Beispiel wäre nur 1 textblock. Aber das wäre sehr kompliziert, und am Ende würde es nur helfen, Szenarien mit wenig Stil variation auf dem Bildschirm. Meine app ist zu haben in vielen Farben, Fliegen (denke, ANSI art), so wäre es immer noch langsam sein, in diesem Fall.
Andere Sache, die ich dachte würde helfen, wenn ich nicht aktualisieren Sie die Textblöcke, sondern gescrollt hat, Sie oben, wenn Sie den Bildschirm gescrollt. So textblocks ist der Wechsel von oben nach unten und dann nur die neue würde, die aktualisiert werden müssen. Ich schaffte es, dass die Arbeit durch die Verwendung eines beobachtbaren Sammlung. Es half, aber seine immer NOCH viel ZU LANGSAM!
Ich auch als eine benutzerdefinierte WPF-control mit der OnRender. Ich erstellte eine, die verwendet drawingContext.RenderText in verschiedener Weise zu sehen, wie schnell es sein könnte. Aber SELBST DAS ist auch verdammt langsam Griff Sie ständig aktualisieren Sie den Bildschirm.
So ist das also .. ich habe da bis auf das design. Ich bin stattdessen auf der Suche mit einer aktuellen Konsole-Fenster, wie hier beschrieben:
Keine Ausgabe in der Konsole von einer WPF-Anwendung?
Ich mag das nicht wirklich, da das Fenster ist getrennt vom Hauptfenster obwohl, ich bin auf der Suche nach einer Möglichkeit zum einbetten der Konsole-Fenster in der WPF-Fenster, wenn das überhaupt möglich ist. Ich werde Fragen, eine andere Frage auf, und verknüpfen Sie es hier wenn ich.
UPDATE: Einbettung der Konsole-Fenster ausgefallen, auch, weil es nicht freundlich zu, dass seine Titelleiste entfernt. Ich habe es umgesetzt, wie eine low-level-Malerei benutzerdefinierte WinForms-Steuerelement, und ich bewirte, dass in WPF. Das funktioniert wunderbar und nach einigen Optimierungen, die sehr sehr schnell.