Я пытаюсь определить некоторые пользовательские правила подсветки для AvalonEdit. Для этого нет никакой документации - там некоторая документация по файловому формату, но ничего о том, как на самом деле загружать и использовать определение, как только вы его создали.
" Синтаксическая подсветка" wiki-страница (для старого WinForms TextEditor) документирует, как загружать выделение определений из файла .xshd на диске, но я предпочел бы вставлять его в качестве ресурса, так же, как это делает AvalonEdit со своими встроенными определениями.
Я просмотрел код в проекте ICSharpCode.AvalonEdit, который загружает свои встроенные маркеры, но фактический код "загрузка с ресурса" выполняется в DefaultHighlightingManager.LoadHighlighting, который является частным - и который, чтобы сделать вещи более странные, по-видимому, только вызываются в сборках релизов.
Я могу продолжать спотыкаться, копировать/вставлять часть кода из частных методов и пытаться объединить что-то вместе, что может или не может работать, но, похоже, стоит спросить: , что является стандартным способом сделайте это? Есть ли рекомендуемый способ для стороннего кода загрузить определение выделения из ресурса?
Ответ Даниэля дал мне хорошее начало, но вам нужно включить имя пространства имен в строку, которую вы передаете GetManifestResourceStream, - если вы этого не сделаете, ll получить исключение NullReferenceException (потому что он возвращает пустой поток).
Я завершил добавление статического класса ResourceLoader в ту же папку проекта, что и файл .xshd, с помощью этого метода:
public static IHighlightingDefinition LoadHighlightingDefinition(
string resourceName)
{
var type = typeof(ResourceLoader);
var fullName = type.Namespace + "." + resourceName;
using (var stream = type.Assembly.GetManifestResourceStream(fullName))
using (var reader = new XmlTextReader(stream))
return HighlightingLoader.Load(reader, HighlightingManager.Instance);
}
Тогда я могу просто позвонить ResourceLoader.LoadHighlightingDefinition("Name.xshd")
.
Для тех, кто следует за домом, для файла .xshd необходимо, чтобы его действие сборки было установлено в Embedded Resource.