AvalonEdit, как добавить новый синтаксис в конвертер - PullRequest
1 голос
/ 20 февраля 2020

Я хочу добавить пользовательское выделение в конвертере и новый синтаксис (JSON), но продолжайте использовать MVVM et c ...

Это означает, что я не должен go таким образом:

editor.HighLight = HightLightLoader.Load()

Я пытался установить свою логику c в конверторе, но она не работает.

Как мне решить эту задачу?

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>

1 Ответ

0 голосов
/ 20 февраля 2020
Свойство

SyntaxHighlighting ожидает объект, который реализует интерфейс IHighlightingDefinition. Вы пытаетесь войти со встроенного 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);
}
...