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 유형입니다. 이것이 실제 아이콘을 화면에 그려주는 부분입니다. 정확한 위치를 알아 내면 xml-comment 블록의 오른쪽 상단을 발견하는 방법을 알지 못하기 때문에 도움이되지 않습니다. 메소드/필드/속성/클래스/등 위에 특별히있는 것은 말할 것도 없습니다. –

+0

왜 NormalizedSnapshotSpanCollection이 필요합니까 ?? 당신은 IWpfTextView에서 현재 편집기 버퍼의 모든 라인을 얻을 수 있고 간단한 regex를 사용하여 일치하는 모든 것을 찾을 수 있다는 것을 아십니까 ///

무엇이든 라인 다음에 원하는 장식 좌표 (아이콘 레이어)에 원하는 좌표를 추가하십시오 선? –

+0

아니요, 그것에 대해서는 전혀 몰라요. 나는 NormalizedSnapshotSpancollection을 사용하는 예제를 보았고 그래서 나는 그것을 필요로한다는 것을 알았습니다 ... 기본적으로 원하는 위치에 아이콘을 붙일 수 있도록 오탐 (false positive)없이 필요한 좌표를 나에게 줄 것입니다. – michael

답변

12

가 여기에 내가 무엇을 얻을 수 있어요 ... 난하지만 다음 각 그룹의 첫 번째 줄에 다음 각 줄에 아이콘을 싶지 않아 ... 그 옆에 아이콘을 배치 할 나는 그것이 당신이 필요로하는 것과 꽤 비슷하다고 생각합니다. 질문이 있으시면 자세한 내용으로 업데이트하겠습니다.

VS 2010 icon adornment

나는 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

에 잠금과 관련이있을 것 같아요

+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 –