04.02.2014, 00:00 Uhr
Kostenloses Syntax Highlighting mit AvalonEdit
Die zentrale Textbox von SharpDevelop steht auch für andere WPF-Projekte zur Verfügung.
Wer Textabschnitte in einem Eingabefeld markiert darstellen will, muss unter WPF auf die RichtTextBox zurückgreifen. Mit ihr lassen sich über TextRange-Objekte ausgewählte Passagen formatieren, also in Schriftart, Farbe oder Hintergrund anpassen.
Allerdings ist das ein steiniger Weg, der noch viel beschwerlicher wird, wenn es nicht nur um das Hervorheben einzelner Wörter geht, sondern das Formatieren eines Quelltextes. Dann müssen Schlüsselwörter eingefärbt, Kommentare ausgegraut oder Strings fett hervorgehoben werden.
AvalonEdit ist genau für diesen Zweck konzipiert worden (NuGet Package). Es handelt sich dabei um das zentrale Editierfeld des Open-Source-Projekts SharpDevelop - eine Entwicklungsumgebung für .NET.
AvalonEdit ist ein WPF-Control, dass Syntax Highlighting schon eingebaut hat. Als Entwickler kann man mit einer sogenannten XSHD-Datei das Syntax Highlighting konfigurieren. Das sind XML-Dateien, die Regeln und Formatierungen festlegen. Eine XSHD-Datei für die Formatierung von C#-Code findet sich beispielsweise auf GitHub.
Hier ein Ausschnitt aus dieser Datei:
@" " span for escape sequences
Die Regel im Span-Abschnitt legt fest, wann es sich bei dem Text um einen String handelt. Das Attribut multiline="true" teilt AvalonEdit mit, dass so ein String auch über mehrere Zeilen gehen kann. Wie das Ganze dann aussehen soll, steht im Tag Color.
Der folgender Code lädt die XSHD-Datei CustomHighlighting.xshd in AvalonEdit.
using (Stream xshd_stream = File.OpenRead("CustomHighlighting.xshd")) { XmlTextReader xshd_reader = new XmlTextReader(xshd_stream); IHighlightingDefinition hd = ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader. Load(xshd_reader, ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance); textEditor.SyntaxHighlighting = hd; xshd_reader.Close(); xshd_stream.Close(); }
Einziger Nachteil von AvalonEdit besteht darin, dass die Text-Eigenschaft kein Dependency Property ist. Sie lässt sich also nicht so einfach in einem MVVM-Szenario anbinden. [tib]