Синтаксис изменения AvalonEdit подсветка в коде
Я хочу изменить подсветку синтаксиса AvalonEdit в моем коде.
XAML:
<avalonEdit:TextEditor Name="textEditor" SyntaxHighlighting="{Binding syntaxHighlighting}" />
C#:
public string syntaxHighlighting { get; set; }
public MainWindow()
{
InitializeComponent();
syntaxHighlighting = "C#";
DataContext = this;
}
но подсветка синтаксиса не изменилась. Что я делаю не так? Есть ли лучшее решение моей проблемы?
5 ответов
здесь вы идете:
ICSharpCode.AvalonEdit.TextEditor textEditor = new ICSharpCode.AvalonEdit.TextEditor();
textEditor.ShowLineNumbers = true;
string dir = @"C:\Program Files\MyFolder\";
#if DEBUG
dir = @"C:\Dev\Sandbox\SharpDevelop-master\src\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\Highlighting\Resources\";
#endif
Stream xshd_stream = File.OpenRead(dir + "CSharp-Mode.xshd");
XmlTextReader xshd_reader = new XmlTextReader(xshd_stream);
textEditor.SyntaxHighlighting = ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(xshd_reader, ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance);
xshd_reader.Close();
xshd_stream.Close();
Edit:
Начиная С ICSharp.TextEditor бросает AccessViolations в WinForms, я использую AvalonEdit в WinForms:
ElementHost host = new ElementHost();
host.Size = new Size(200, 100);
host.Location = new Point(100, 100);
host.Child = textEditor;
this.Controls.Add(host);
просто используйте TypeConverter
var typeConverter = new HighlightingDefinitionTypeConverter();
var xmlSyntaxHighlighter = (IHighlightingDefinition)typeConverter.ConvertFrom("XML");
var csSyntaxHighlighter = (IHighlightingDefinition)typeConverter.ConvertFrom("C#");
CSharpEditor.SyntaxHighlighting = csSyntaxHighlighter;
XmlEditor.SyntaxHighlighting = xmlSyntaxHighlighter;
syntaxHighlighting не является строкой! ваш код может не компилироваться! Обратите внимание, что SyntaxHighlighting в XAML здесь использует расширения разметки, который создает экземпляр SyntaxHighlighting, а не строку.
private void OnTabLoaded(object sender, RoutedEventArgs e)
{
textEditor.SyntaxHighlighting = HighlightingLoader.Load(..., HighlightingManager.Instance);
textEditor.SyntaxHighlighting.MainRuleSet=...
}
на sharpdevelop и загрузите исходный код.
Если вы хотите привязаться к строке, вы можете определить IValueConverter, чтобы обернуть встроенный HighlightingDefinitionTypeConverter:
using System;
using System.Globalization;
using System.Windows.Data;
using ICSharpCode.AvalonEdit.Highlighting;
public class HighlightingDefinitionConverter : IValueConverter
{
private static readonly HighlightingDefinitionTypeConverter Converter = new HighlightingDefinitionTypeConverter();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return Converter.ConvertFrom(value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Converter.ConvertToString(value);
}
}
затем просто добавьте конвертер в свою привязку:
<avalonEdit:TextEditor Name="textEditor" SyntaxHighlighting="{Binding syntaxHighlighting, Converter={StaticResource HighlightingDefinitionConverter}}" />