【问题标题】:AvalonEdit how to add new syntax in converterAvalonEdit 如何在转换器中添加新语法
【发布时间】:2020-02-20 16:09:29
【问题描述】:

我想在转换器和新语法 (JSON) 中添加自定义突出显示,但是,继续使用 MVVM 等...

也就是说,我不能走这条路:

editor.HighLight = HightLightLoader.Load()

我试图在转换器中设置我的逻辑,但它不起作用。

我怎样才能完成这项任务?

public class HighlightingDefinitionConverter: IValueConverter
    {
        private static readonly HighlightingDefinitionTypeConverter Converter = new HighlightingDefinitionTypeConverter();

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var json = value as string;
            if (json.Equals("JSON"))
            {
                var xmlTextReader = new XmlTextReader("JSONHighLight.xshd");
                return Converter.ConvertFrom(xmlTextReader);
            }

            return Converter.ConvertFrom(value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Converter.ConvertToString(value);
        }
    }

我的 xshd 文件:

<?xml version="1.0" encoding="utf-8" ?>
<SyntaxDefinition name="JSON" extensions=".js" xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008">
    <Color name="Digits" foreground="#8700FF" exampleText="3.14" />
    <Color name="Value" foreground="#000CFF" exampleText="var text = &quot;Hello, World!&quot;;" />
    <Color name="ParamName" foreground="#057500"  exampleText="var text = &quot;Hello, World!&quot;;" />
    <RuleSet ignoreCase="false">
        <Keywords color="Digits" >
            <Word>true</Word>
            <Word>false</Word>
        </Keywords>
        <Span color="ParamName">
            <Begin>"</Begin>
            <End>(?=:)</End>
        </Span>
        <Span color="Value" multiline="true">
            <Begin>
                (?&lt;=:)\040"[^"]*
            </Begin>
            <End>"</End>
        </Span>
        <Rule color="Digits">\b0[xX][0-9a-fA-F]+|(\b\d+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?</Rule>
    </RuleSet>
</SyntaxDefinition>

【问题讨论】:

    标签: c# wpf data-binding avalonedit avaloniaui


    【解决方案1】:

    SyntaxHighlighting 属性需要一个实现IHighlightingDefinition 接口的对象。你试图从内置的HighlightingDefinitionTypeConverter 继续,但它是tries to look up one by name,所以传递它 XmlTextReader 将不起作用。

    可以找到从流中加载语法的代码示例here

    using (var s = Resources.OpenStream(resourceName))
    using (var reader = XmlReader.Create(s))
    {    
        var xshd = HighlightingLoader.LoadXshd(reader, true);
        return HighlightingLoader.Load(xshd, this);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-19
      • 2012-03-17
      • 1970-01-01
      • 2012-08-02
      • 2017-07-05
      • 2011-09-11
      • 2014-04-12
      • 1970-01-01
      • 2023-02-06
      相关资源
      最近更新 更多