24

AvalonEditのカスタム強調表示ルールを定義しようとしています。このためのドキュメントはないようです。ファイル形式に関するドキュメントはいくつかありますが、定義を作成した後で実際にロードして使用する方法については何もありません。

構文の強調表示」wikiページ(古いWinForms TextEditorの場合)には、ディスク上の.xshdファイルから強調表示の定義を読み込む方法が記載されていますが、AvalonEditが組み込みの定義で行うのと同じように、リソースとして埋め込みます。 。

組み込みの蛍光ペンをロードするICSharpCode.AvalonEditプロジェクトのコードを見てきましたが、実際の「リソースからのロード」コードはDefaultHighlightingManager.LoadHighlightingで実行されます。これはプライベートであり、さらに奇妙なことに、どうやらリリースビルドでのみ呼び出されます。

私はいじくり回し続け、プライベートメソッドからコードの一部をコピーして貼り付け、うまくいくかもしれないし、うまくいかないかもしれない何かを一緒に考えてみることができますが、尋ねる価値があるようです:これを行う標準的な方法は何ですか?サードパーティのコードがリソースから強調表示の定義をロードするための推奨される方法はありますか?


ダニエルの答えは私に良いスタートを与えましたが、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")

自宅でフォローしている人は、.xshdファイルのビルドアクションを埋め込みリソースに設定する必要があります。

4

5 に答える 5

28

クラスの静的メソッドを使用して、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を熱心にロードするため(エラーがすぐに通知されるように)奇妙ですが、リリースビルドでは遅延ロードされます。

于 2011-02-20T14:03:03.100 に答える
9

私は個人的に、を使用してハイライト定義を登録するダレンの方法を好みます。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"/>
于 2017-10-01T12:59:03.857 に答える
5

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
于 2013-10-18T17:30:04.617 に答える
3

xshdファイルにGetManifestResourceStreamを使用すると、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);
            }
        }
于 2014-06-05T04:28:45.610 に答える
0

リソース文字列を作成して「xshd」と呼び、コンテンツに必要なものを書き込みます。次に、この単純なコードを使用します。

XmlReader xshdres = XmlReader.Create(new MemoryStream(Encoding.Unicode.GetBytes(Properties.Resources.xshd)));
textEditor.SyntaxHighlighting = HighlightingLoader.Load(xshdres, HighlightingManager.Instance);

textEditorこれは、XAMLのavaloneditテキストエディターの名前です。

于 2019-07-31T01:49:08.273 に答える