1

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

1 回答 1

0

SyntaxHighlightingproperty 需要一个实现IHighlightingDefinition接口的对象。您正在尝试从 built-in 开始HighlightingDefinitionTypeConverter,但它会尝试按名称查找一个,因此传递它 XmlTextReader 将不起作用。

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

using (var s = Resources.OpenStream(resourceName))
using (var reader = XmlReader.Create(s))
{    
    var xshd = HighlightingLoader.LoadXshd(reader, true);
    return HighlightingLoader.Load(xshd, this);
}
于 2020-02-20T16:59:47.443 回答