8

これを行う方法を見つけるのに問題があり、Visual Studio SDKリファレンスはあまり役に立ちません。Visual Studio 2010 SDK - XMLコメントグループの隣に装飾を置くにはどうすればいいですか?

XMLコメントのNormalizedSnapshotSpanCollectionを取得する方法を理解しようとしています。私は、ここで

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

私はあなたに完全な答えを与えることはできないと思いますが、残念ながらIAdornmentLayerを理解する必要があることを指摘できます(ビューの上に描画する方法です)。ビュー自体はIWpfTextViewの一種です。それが画面上に実際のアイコンを描くための部分です。私があなたに助けることができない正確な位置を特定する方法は、/ field/property/class /などの上にあるxml-commentブロックの右上をどうやって発見するかわからないからです。 –

+0

なぜNormalizedSnapshotSpanCollectionが必要ですか?現在のエディタバッファのすべての行をIWpfTextViewから取得し、単純な正規表現を使用して一致するものをすべて見つけることができますか?///

何でも行は、あなたの装飾層にあるアイコンを、ライン? –

+0

いいえ、私はそれについて考えていません。私はNormalizedSnapshotSpancollectionを使用した例を見たので、私はそれが必要であると思った。基本的には、誤ったポジションなしで必要な座標がわかるので、必要なところにアイコンを置くことができる。 – michael

答えて

12

は私が得ることができるものだ...唯一の次の各グループの最初の行に、私は次の各行にアイコンを望んでいない...横にアイコンを配置したいのですが、私はそれがあなたが必要とするものにかなり似ていると思う。質問がある場合は、これを詳細に更新します。

VS 2010 icon adornment

私はVS 2010 SDKのWebサイトからthis sampleから始まりました。それはすでにあなたが必要とするものにかなり近いですが、さらにいくつかのステップが必要です。


C#版をダウンロードし、フォルダに展開してコンパイルします。 >それを実行し、プロジェクトに行く必要がテストするためのプロパティ]> [デバッグ

あなたは、あなたのVS 2010のアプリにコマンドライン引数には例えばC:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe

「をスタート外部プログラム」オプションと設定されているパスを選択する必要がありますセット:/rootsuffix Exp

今、あなたは、それを実行できるように開かれたVSでいくつかのサンプルプロジェクトを作成し、あなたが00AA00のようにどこでも6桁の番号を入力すると、それは、対応する色の四角形として表示されます必要があります。デバッグVSインスタンスを閉じます。


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

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

これはテキスト範囲の直後ではなく、その前に装飾が配置されます:あなたはSnapshotSpan adornmentSpanが初期化された場所を見つけると、ラインを変更する必要があり、同じファイルで


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ロゴが表示されるはずです。


いくつかの余分な発言。

まず最初に、このようにして作業プロトタイプを作成するだけで、クラスの名前を変更し、必要に応じてコードをクリーンアップする必要があります。

第2に、私がデバッグしていたとき、私のデバッグVSは時々凍結していました。このように

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)); 
    } 
私はあなたにも凍結を参照してください。このように、以下の方法を更新しようとした場合、これはIntraTextAdornmentTagger.cs

でロックに関連するかもしれないと思います

+0

まあ、それは間違いなく良い出発点です。コメントブロックが有効なクラス、列挙型、構造体、プロパティ、フィールド、メソッドなどの上にあることを検出するアルゴリズムを期待していましたが、これは私が今考えているように近いです。それは '///

*'に依存するという事実にはいくつかの欠点があります。なぜなら、私はそれを他の場所に置き、偽陽性を得ることができるからです(私はそれが意味をなさないと知っています)。いずれにしても、多くの人を援助するための完全な+200。 – michael

+0

また、devenv.exe呼び出しに '/ rootsuffix Exp'パラメータが必要なのはなぜですか? – michael

+0

@マイケル:ありがとう! '/ rootsuffix Exp'はあなたの実験からデフォルトのVSを守るためのものです。http://msdn.microsoft.com/en-us/library/bb166560(v=VS.80).aspx –

関連する問題