7

これを行う方法を見つけるのに問題があり、VisualStudioSDKリファレンスもあまり役に立ちません。

NormalizedSnapshotSpanCollectionXMLコメントを取得する方法を理解しようとしています。それらの横にアイコンを配置したい...各行の横にアイコンは必要ありませんが、各グループの最初の行の横にのみ配置します...

///<summary>SomeXML Comment</summary>   [ICON]
///<remarks>some remarks</remarks>
public void Foo()
{
    ///Some false XML comment line that does not get an icon.
}
4

1 に答える 1

11

これが私が得ることができるものです、私はそれがあなたが必要とするものにかなり似ていると思います。ご不明な点がございましたら、詳細をお知らせします。

VS2010アイコン装飾

VS 2010SDKWebサイトのこのサンプルから始めました。すでに必要なものにかなり近いですが、さらにいくつかの手順が必要です。


C#バージョンをダウンロードし、フォルダーに解凍してコンパイルします。それを実行してテストするには、[プロジェクト]>[プロパティ]>[デバッグ]に移動する必要があります

たとえば、[外部プログラムの開始]オプションを選択し、VS2010アプリへのパスを設定する必要がありますC:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe

コマンドライン引数セットで:/rootsuffix Exp

これで、それを実行し、開いたVSでサンプルプロジェクトを作成できるはずです。どこかに6桁の数字を入力00AA00すると、対応する色の長方形として表示されます。デバッグVSインスタンスを閉じます。


それでは、いくつかのコードを編集しましょう。ColorAdornmentTagger.csコメントで定義します#define HIDING_TEXT。これにより、テキストの代わりではなく、テキストの横に装飾が表示されます。

同じファイルで、初期化されている場所を見つけてSnapshotSpan adornmentSpan、行を次のように変更する必要があります。

SnapshotSpan adornmentSpan = new SnapshotSpan(colorTagSpans[0].End, 0);

これにより、装飾はテキストスパンの前ではなく、テキストスパンのに配置されます。


ColorTagger.cs。コンストラクターの正規表現を変更して、コンストラクターが次のようになるようにします。

    internal ColorTagger(ITextBuffer buffer)
        : base(
        buffer, 
        new[] { new Regex(@"/// <summary>.*", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase) }
        )
    {
    }

これにより、メソッドの解説行を認識するように正規表現が設定されます。

このクラスの他のメソッドは使用しません。コメントを付けるか、ランダムな色を返すことができます。


'ColorAdornment.cs'内。これは、装飾のWPFコントロール自体です。まず、基本クラスをからButtonに変更しContentControlます。クラスのコンストラクターを次のように変更します

    internal ColorAdornment(ColorTag colorTag)
    {
        BitmapImage image = new BitmapImage(); 
        using (FileStream stream = File.OpenRead("c:\\temp\\sologo.png")) 
        { 
            image.BeginInit(); 
            image.StreamSource = stream; 
            image.CacheOption = BitmapCacheOption.OnLoad; 
            image.EndInit(); 
        }

        this.Content = new Image() { Margin = new Thickness(20,0,0,0), Width = 100, Height = 30, Source = image };
    }

画像パスを必要な画像パスに変更できます。ウィキペディアからSOロゴをダウンロードして、一時フォルダーに入れました。

コンパイルして実行します。デバッグVSインスタンスのコメントの横にSOロゴが表示されるはずです。


いくつかの追加の発言。

まず、この方法で、最初に機能するプロトタイプを取得します。クラスの名前を変更し、必要に応じてコードをクリーンアップする必要があります。

第二に、私がそれをデバッグしていたとき、私のデバッグVSは時々フリーズしていました。これは、ロックのロックに関連している可能性があると思いますIntraTextAdornmentTagger.cs

フリーズも見られる場合は、次の方法で次のメソッドを更新してみてください。

    protected void InvalidateSpans(IList<SnapshotSpan> spans)
    {
        if (spans.Count == 0)
            return;
        bool wasEmpty = false;
        lock (this.invalidatedSpans)
        {
            wasEmpty = this.invalidatedSpans.Count == 0;
            this.invalidatedSpans.AddRange(spans);
        }

        if (wasEmpty)
            this.view.VisualElement.Dispatcher.BeginInvoke(new Action(AsyncUpdate));
    }

そしてこのようにAsyncUpdate:

    private void AsyncUpdate()
    {
        // Store the snapshot that we're now current with and send an event
        // for the text that has changed.
        if (this.snapshot != this.view.TextBuffer.CurrentSnapshot)
        {
            this.snapshot = this.view.TextBuffer.CurrentSnapshot;

            Dictionary<SnapshotSpan, TAdornment> translatedAdornmentCache = new Dictionary<SnapshotSpan, TAdornment>();

            foreach (var keyValuePair in this.adornmentCache)
                translatedAdornmentCache.Add(keyValuePair.Key.TranslateTo(this.snapshot, SpanTrackingMode.EdgeExclusive), keyValuePair.Value);

            this.adornmentCache = translatedAdornmentCache;
        }

        List<SnapshotSpan> spansCopy;
        lock (this.invalidatedSpans)
        {
            spansCopy = this.invalidatedSpans.ToList();
            this.invalidatedSpans.Clear();
        }

        List<SnapshotSpan> translatedSpans = spansCopy.Select(s => s.TranslateTo(this.snapshot, SpanTrackingMode.EdgeInclusive)).ToList();

        if (translatedSpans.Count == 0)
            return;

        var start = translatedSpans.Select(span => span.Start).Min();
        var end = translatedSpans.Select(span => span.End).Max();

        RaiseTagsChanged(new SnapshotSpan(start, end));
    }
于 2012-02-21T22:37:02.190 に答える