【问题标题】:AvalonEdit Change Syntax Highlighting in CodeAvalonEdit 在代码中更改语法突出显示
【发布时间】:2013-04-16 16:21:26
【问题描述】:

我想在我的代码中更改 AvalonEdit 的语法高亮。

XAML:

 <avalonEdit:TextEditor Name="textEditor" SyntaxHighlighting="{Binding syntaxHighlighting}" />

C#:

public string syntaxHighlighting { get; set; }

public MainWindow()
{
     InitializeComponent();
     syntaxHighlighting = "C#";
     DataContext = this;
}

但是语法高亮没有改变。我究竟做错了什么?我的问题有更好的解决方案吗?

【问题讨论】:

    标签: c# wpf syntax-highlighting text-editor avalonedit


    【解决方案1】:
    ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance.GetDefinition("C#");
    

    【讨论】:

    • ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance.GetDefinitionByExtension(Path.GetExtension(FileName));
    【解决方案2】:

    给你:

    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 在 WinForms 中抛出 AccessViolations,我在 WinForms 中使用 AvalonEdit:

    ElementHost host = new ElementHost();
    host.Size = new Size(200, 100);
    host.Location = new Point(100, 100);
    host.Child = textEditor;
    this.Controls.Add(host);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 非常适合 MVVM!
      【解决方案4】:

      只需使用 TypeConverter

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

      【讨论】:

        【解决方案5】:

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

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

        前往sharpdevelop并下载源代码。

        【讨论】:

        • 哦,我明白了,你知道我该如何解决吗?当我只有它的名称时,我可以更改语法吗?
        • 你最好下载SharpDevelop源码并研究一下源码,会有很大帮助的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 2019-04-12
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        相关资源
        最近更新 更多