2013-04-23 261 views
8

我想在我的代码中更改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(); 

编辑:

由于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); 
+1

它的工作原理,谢谢。 – 2013-05-06 05:50:23

0

syntaxHighlighting不是一个字符串!你的代码可能无法编译!请注意,此处XAML中的SyntaxHighlighting使用markup extensions,它实例化了SyntaxHighlighting的一个实例,而不是字符串。

private void OnTabLoaded(object sender, RoutedEventArgs e) 
{ 
    textEditor.SyntaxHighlighting = HighlightingLoader.Load(..., HighlightingManager.Instance); 
    textEditor.SyntaxHighlighting.MainRuleSet=... 
} 

转到sharpdevelop并下载源代码。

+0

哦,我明白了,你知道我能解决吗?当我只有它的名字时,我可以更改语法吗? – 2013-04-23 12:55:17

+0

你最好下载SharpDevelop源码,并对源代码进行研究,这将有很大的帮助。 – David 2013-04-23 12:58:54

23
ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance.GetDefinition("C#"); 
+1

'ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance.GetDefinitionByExtension(Path.GetExtension(FileName));' – 2016-03-11 14:05:55

1

只需使用TypeConverter

var typeConverter = new HighlightingDefinitionTypeConverter(); 
var xmlSyntaxHighlighter = (IHighlightingDefinition)typeConverter.ConvertFrom("XML"); 
var csSyntaxHighlighter = (IHighlightingDefinition)typeConverter.ConvertFrom("C#"); 
CSharpEditor.SyntaxHighlighting = csSyntaxHighlighter; 
XmlEditor.SyntaxHighlighting = xmlSyntaxHighlighter; 
0

如果你要绑定到一个字符串,您可以定义的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}}" />