これが私が得ることができるものです、私はそれがあなたが必要とするものにかなり似ていると思います。ご不明な点がございましたら、詳細をお知らせします。
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));
}