は私が得ることができるものだ...唯一の次の各グループの最初の行に、私は次の各行にアイコンを望んでいない...横にアイコンを配置したいのですが、私はそれがあなたが必要とするものにかなり似ていると思う。質問がある場合は、これを詳細に更新します。
私は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
でロックに関連するかもしれないと思います
私はあなたに完全な答えを与えることはできないと思いますが、残念ながらIAdornmentLayerを理解する必要があることを指摘できます(ビューの上に描画する方法です)。ビュー自体はIWpfTextViewの一種です。それが画面上に実際のアイコンを描くための部分です。私があなたに助けることができない正確な位置を特定する方法は、/ field/property/class /などの上にあるxml-commentブロックの右上をどうやって発見するかわからないからです。 –
なぜNormalizedSnapshotSpanCollectionが必要ですか?現在のエディタバッファのすべての行をIWpfTextViewから取得し、単純な正規表現を使用して一致するものをすべて見つけることができますか?///何でも 行は、あなたの装飾層にあるアイコンを、ライン? –
いいえ、私はそれについて考えていません。私はNormalizedSnapshotSpancollectionを使用した例を見たので、私はそれが必要であると思った。基本的には、誤ったポジションなしで必要な座標がわかるので、必要なところにアイコンを置くことができる。 – michael