가 여기에 내가 무엇을 얻을 수 있어요 ... 난하지만 다음 각 그룹의 첫 번째 줄에 다음 각 줄에 아이콘을 싶지 않아 ... 그 옆에 아이콘을 배치 할 나는 그것이 당신이 필요로하는 것과 꽤 비슷하다고 생각합니다. 질문이 있으시면 자세한 내용으로 업데이트하겠습니다.
나는 VS 2010 SDK 웹 사이트에서
this sample 시작했다. 그것은 이미 당신이 필요로하는 것에 아주 가깝지만 몇 가지 더 많은 단계가 필요합니다.
C# 버전을 다운로드하고 폴더에 압축을 풉니 다. 그것을 실행하고 프로젝트> 속성> 디버그에 갈 필요가 테스트하려면
는 명령 행 인수에 예를
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe
에 대해 "시작 외부 프로그램"당신의 VS 2010 응용 프로그램에 대한 옵션을 설정하고 경로를 선택해야
설정 : /rootsuffix Exp
열린 VS에서 몇 가지 샘플 프로젝트를 만들고 실행할 수 있어야합니다. 00AA00
과 같이 여섯 자리 숫자를 입력하면 해당 색상이있는 사각형으로 표시됩니다. 디버그 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 };
}
으로 변경하십시오. 필요한 이미지 경로로 이미지 경로를 변경할 수 있습니다.방금 Wikipedia에서 SO 로고를 다운로드하고 임시 폴더에 넣었습니다.
컴파일하고 실행하십시오. 디버그 VS 인스턴스의 주석 옆에 SO 로고가 표시되어야합니다.
일부 추가 설명이 있습니다.
먼저,이 방법으로 시작하면 작동하는 프로토 타입을 얻을 수 있습니다. 클래스의 이름을 바꾸고 필요에 맞게 코드를 정리해야합니다.
둘째, 디버깅 할 때 디버그 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 유형입니다. 이것이 실제 아이콘을 화면에 그려주는 부분입니다. 정확한 위치를 알아 내면 xml-comment 블록의 오른쪽 상단을 발견하는 방법을 알지 못하기 때문에 도움이되지 않습니다. 메소드/필드/속성/클래스/등 위에 특별히있는 것은 말할 것도 없습니다. –
왜 NormalizedSnapshotSpanCollection이 필요합니까 ?? 당신은 IWpfTextView에서 현재 편집기 버퍼의 모든 라인을 얻을 수 있고 간단한 regex를 사용하여 일치하는 모든 것을 찾을 수 있다는 것을 아십니까 /// 무엇이든 라인 다음에 원하는 장식 좌표 (아이콘 레이어)에 원하는 좌표를 추가하십시오 선? –
아니요, 그것에 대해서는 전혀 몰라요. 나는 NormalizedSnapshotSpancollection을 사용하는 예제를 보았고 그래서 나는 그것을 필요로한다는 것을 알았습니다 ... 기본적으로 원하는 위치에 아이콘을 붙일 수 있도록 오탐 (false positive)없이 필요한 좌표를 나에게 줄 것입니다. – michael