Как создать синтаксический файл AvalonEdit (.xshd) и вставить его в мою сборку?
Я пытаюсь определить некоторые пользовательские правила подсветки для AvalonEdit. Кажется, для этого нет никакой документации - есть некоторая документация по формату файла, но ничего о том, как на самом деле загрузить и использовать определение после его создания.
в "синтаксис" wiki-страница (для старого текстового редактора WinForms) документы, как загрузить определения подсветки из a .xshd-файл на диске, но я бы предпочел встроить его в качестве ресурса, так же, как AvalonEdit делает со своими встроенными определениями.
Я просмотрел код в ICSharpCode.Проект AvalonEdit, который загружает встроенные маркеры, но фактический код "загрузка из ресурса" выполняется в DefaultHighlightingManager.LoadHighlighting, который является частным-и который, чтобы сделать вещи более странными, по-видимому, называется только в сборках выпуска.
Я могу продолжать возиться, копировать / вставлять некоторые из кода из частных методов и пытаться cobble что-то вместе, что может или не может работать, но, кажется, стоит спросить:что это стандартный способ сделать это? есть ли рекомендуемый способ для стороннего кода загрузить определение выделения из ресурса?
Дэниел дал мне хорошее начало, но вам нужно включить имя пространства имен в строку, которую вы передаете GetManifestResourceStream -- если вы этого не сделаете, вы получите исключение NullReferenceException (потому что оно возвращает null поток.)
Я закончил добавление статического класса 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")
.
для тех, кто следует вдоль дома, the .файл xshd должен иметь действие сборки, установленное для Embedded Resource.
4 ответов
Вы можете использовать статические методы в классе ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader
загрузить .файлы xshd.
Например:
using (Stream s = myAssembly.GetManifestResourceStream("MyHighlighting.xshd")) {
using (XmlTextReader reader = new XmlTextReader(s)) {
textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
}
}
код загрузки в AvalonEdit сам по себе странный, потому что он охотно загружает xshds в отладочных сборках (так что ошибки в них сразу замечаются), но задержка-загружает их в сборках выпуска.
для чего это стоит, если вы используете F#, это фрагмент кода, который работает для регистрации файла xshd.
let registerHighlighting() =
try
// Load our custom highlighting definition
match System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("GSLhighlighting.xshd") with
| null -> failwithf "ERROR: could not find embedded resource"
| s ->
use reader = new XmlTextReader(s)
let gslHighlighting = ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(reader, HighlightingManager.Instance)
// and register it in the HighlightingManager
HighlightingManager.Instance.RegisterHighlighting("GSL", [| ".gsl" |], gslHighlighting)
editor.SyntaxHighlighting <- gslHighlighting
with _ as exn ->
printfn "ERROR: %s" exn.Message
Я лично предпочитаю способ Даррена регистрации вашего определения подсветки с помощью RegisterHighlighting
, затем вы можете использовать его в XAML, как и другие встроенные определения.
C#
public partial class App : Application
{
public App()
{
using (var stream = new System.IO.MemoryStream(WpfApp15.Properties.Resources.sql))
{
using (var reader = new System.Xml.XmlTextReader(stream))
{
ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance.RegisterHighlighting("SQL", new string[0],
ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(reader,
ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance));
}
}
}
}
XAML
<avalon:TextEditor SyntaxHighlighting="SQL"/>
когда я использовал GetManifestResourceStream для файла xshd, я получил null. Вместо этого я использовал StreamReader:
using (StreamReader s =
new StreamReader(@"C:\Users\Smadar.Tsdaka\Documents\ServoStudio\Scripts\ServoStudioSyntax.xshd"))
{
using (XmlTextReader reader = new XmlTextReader(s))
{
scriptBody.SyntaxHighlighting =
ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(
reader,
HighlightingManager.Instance);
}
}