Como faço para criar um ficheiro de sintaxe AvalonEdit (.e incorporá-lo na minha Assembleia?
a página wiki" realce de sintaxe " (para o antigo editor de texto WinForms) documenta como carregar as definições de realce a partir de A.arquivo xshd no disco, mas eu prefiro incorporá-lo como um recurso, da mesma forma AvalonEdit faz com suas definições embutidas.
Vi o código no código ICSharpCode.AvalonEdit project que carrega os seus marcadores embutidos, mas o código "carga do recurso" é feito no Defaulthlightingmanager.LoadHighlighting, que é privado -- e que, para tornar as coisas mais estranhas, aparentemente só é chamado em builds de lançamento. Posso continuar a andar às voltas, copiar / colar alguns dos códigos dos métodos privados, e tentar arranjar algo que possa ou não ser um código. pode não funcionar, mas parece que vale a pena perguntar: Qual é a maneira padrão de fazer isto? existe uma forma recomendada para o código de terceiros carregar uma definição de realce a partir de um recurso?a resposta do Daniel deu-me um bom começo, mas precisa de incluir o nome do espaço de nomes no texto que passa para obter o Manifestresourcestream -- se não o fizer, obterá uma isenção de referência completa (porque devolve um fluxo nulo).
Acabei por adicionar uma classe estática chamada ResourceLoader para a mesma pasta do projeto .ficheiro xshd, com este método: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);
}
Então posso ligar.
para qualquer um que nos Siga em casa, o .o ficheiro xshd precisa de ter a sua acção de Compilação definida no recurso incorporado.
4 answers
Pode usar os métodos estáticos da classe ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader
para carregar .ficheiros xshd.
Por exemplo:
using (Stream s = myAssembly.GetManifestResourceStream("MyHighlighting.xshd")) {
using (XmlTextReader reader = new XmlTextReader(s)) {
textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
}
}
O código de carregamento no AvalonEdit em si é estranho porque ele carrega ansiosamente os xshds em compilações de depuração (de modo que os erros neles são notados imediatamente), mas atrasa-os em compilações de lançamento.
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
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"/>
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);
}
}