繁体   English   中英

AvalonEdit 如何在转换器中添加新语法

[英]AvalonEdit how to add new syntax in converter

我想在转换器和新语法(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>

SyntaxHighlighting属性需要一个实现IHighlightingDefinition接口的对象。 您正在尝试从内置的HighlightingDefinitionTypeConverter ,但它尝试按 name 查找一个,因此传递它 XmlTextReader 将不起作用。

可以在此处找到从流加载语法的代码示例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM