최근 Visual Studio 블로그( http://blogs.msdn.com/visualstudio/ )에 VS2010 Extension이 자주 언급되어 공부하고 싶어서 문서를 찾아보고 싶었습니다. 이 주제에 대한 완전한 소개가 아니었기 때문에 VS IDE에서 템플릿에서 제공하는 내용과 Visual Studio 블로그에서 설명을 찾아보아야 했으며, 몇 가지 코드를 작성하고 실제 실습을 준비했습니다. , 이 템플릿으로 만든 Extension이 너무 단순하다고 느꼈습니다. 우연히 AxTool( http://www.axtools.com/products-vs2010-extensions.php )에 VS인 코드 편집기 확장이 있는 것을 보았습니다. Extension이므로 이것을 따라 단계별로 만들었습니다.
우선 VS 확장 프로젝트를 생성하려면 현재 Beta2 버전인 VS2010 SDK를 설치해야 합니다. http://go.microsoft.com/fwlink/?LinkID=165597 ). 여기에서는 Editor를 사용합니다. Text Adornment 템플릿으로 만든 프로젝트입니다. 템플릿을 통해 자신만의 Extension 프로젝트를 만드는 방법은 자세히 쓰지 않겠습니다. 이에 대해 익숙하지 않은 경우 Quan To의 이 게시물을 참조하세요. - Visual Studio 2010용 확장을 빌드하고 게시합니다.
프로젝트가 빌드된 후 TextViewCreationListener가 자동으로 생성됩니다. IWpfTextViewCreationListener 인터페이스가 여기에서 구현되고 IWpfTextViewCreationListener 개체가 MEF를 통해 내보내집니다.
[TextViewRole("DOCUMENT")] [Export(typeof(IWpfTextViewCreationListener))] [ContentType("text")] 내부 봉인 클래스 PETextViewCreationListener : IWpfTextViewCreationListener { void IWpfTextViewCreationListener.TextViewCreated(IWpfTextView textView) { //... } }
이러한 방식으로 VS는 적절한 시간에 IWpfTextViewCreationListener.TextViewCreated 메서드를 호출하여 텍스트 편집 상태 변경을 알립니다.
자신만의 도구 모음을 띄우려면 AdornmentLayerDefinition을 내보내고 Order 속성을 통해 이 장식 레이어의 표시 위치와 순서를 사용자 정의해야 합니다.
[Name("QuickToolbarAdornmentLayer")] [Order(After = "Text")] [Export(typeof(AdornmentLayerDefinition))] public AdornmentLayerDefinition QuickToolbarLayerDefinition { get;
여기서 Name 속성은 매우 중요합니다. 향후 코드에서 AdornmentLayer를 얻으려면 이 속성을 사용하세요.
this._adornmentLayer = this._textView.GetAdornmentLayer("QuickToolbarAdornmentLayer");
한 단계 더 나아가 IWpfTextViewCreationListener.TextViewCreated로 돌아가 보겠습니다. 여기를 통해 IWpfTextView를 얻을 수 있습니다.
이는 모든 작업의 목표이자 표현입니다. 또한 사용자 동작에 응답하려면 Closed, LayoutChanged, MouseHovered, SelectionChanged 및 기타 이벤트를 중단해야 합니다.
도구 모음을 통해 코드를 조작하려면 MEF를 통해 IEditorOperationsFactoryService를 가져와야 합니다.
[가져오기] 내부 IEditorOperationsFactoryService EditorOperationsFactoryService { get }
이런 식으로 IWpfTextViewCreationListener.TextViewCreated의 IEditorOperationsFactoryService.GetEditorOperations(ITextView)를 통해 IEditorOperations를 얻을 수 있어 코드를 편리하고 빠르게 편집할 수 있습니다.
다음으로, 도구 모음 인터페이스를 구현해야 합니다. 이에 대해서는 자세히 설명하지 않겠습니다. UserControl을 만들고 그 안에 ToolBar를 넣기만 하면 됩니다. 그렇다면 이 ToolBar를 언제 어디에 표시해야 할까요? 이는 IWpfTextView의 SelectionChanged 이벤트에 따라 다릅니다. 위에서 언급한 이벤트가 여기서 사용됩니다.
암호
1 개인 무효 MayBeAdornmentShowCondition() 2 { 3 if (!this._textView.Selection.IsEmpty) 4 { 5 SnapshotPoint startPos = this._textView.Selection.Start.Position; 6 SnapshotPoint endPos = this._textView.Selection.End.Position; 7 IWpfTextViewLine textViewLineContainingBufferPosition = this._textView.GetTextViewLineContainingBufferPosition(startPos); 8 TextBounds CharacterBounds = textViewLineContainingBufferPosition.GetCharacterBounds(startPos); 9 TextBoundsbounds2 = this._textView.GetTextViewLineContainingBufferPosition(endPos);1 0 if (this._fromMouseHover)11 {12 this._mustHaveAdornmentDisplayed = true;13 }14 else15 {16 PELeftButtonMouseProcessor 속성 = null;17 try18 {19 속성 = this._textView.Properties.GetProperty<PELeftButtonMouseProcessor>(typeof(PELeftButtonMouseProcessor));20 }21 catch22 {23 }24 this._mustHaveAdornmentDisplayed = (속성 != null)25 && (property.IsLeftButtonDown26 || ((DateTime.Now - property.LastLeftButtonDownTime).TotalMilliseconds < 400.0));27 }28 if (this._mustHaveAdornmentDisplayed)29 {30 TextBounds SelectionBounds = !this._textView.Selection.IsReversed ?bounds2 : CharacterBounds;31 int offset = 7;32 double top = SelectionBounds.Top + (!this._textView.Selection.IsReversed ? (offset + textViewLineContainingBufferPosition.Height) : (-offset - this ._adornmentUI.ActualHeight));33 if (top < 0.0)34 {35 top = 0.0;36 }37 double left = CharacterBounds.Left + ((bounds2.Left - CharacterBounds.Left) / 2.0);38 if ((왼쪽 + this._adornmentUI.ActualWidth) > this._textView.ViewportWidth)39 {40 왼쪽 = this._textView.ViewportWidth - this._adornmentUI.ActualWidth;41 }42 Canvas.SetTop(this._adornmentUI, 상단);43 Canvas.SetLeft( this._adornmentUI, 왼쪽);44 긴 문자 = 0L;45 try46 {47 문자 = this._textView.Selection.SelectedSpans[0].Span.Length;48 }49 catch50 {51 }52 this._adornmentUI.SetStatus(chars) ;53 this.RenderSelectionPopup();54 }55 }56 else57 {58 this._mustHaveAdornmentDisplayed = false;59 this._adornmentLayer.RemoveAdornmentsByTag(this._adornmentTag);60 }61 }62 63 private void RenderSelectionPopup()64 {65 if ( this._mustHaveAdornmentDisplayed)66 {67 IAdornmentLayerElement 요소 = null;68 try69 {70 요소 = this._adornmentLayer.Elements.First<IAdornmentLayerElement>(71 (IAdornmentLayerElement ile) => ile.Tag.ToString() == this._adornmentTag); 72 }73 catch(InvalidOperationException)74 {75 }76 if (element == null)77 {78 this._adornmentLayer.AddAdornment(this._textView.Selection.SelectedSpans[0], this._adornmentTag, this._adornmentUI);79 } 80 this._timer.Stop();81 this._timer.Start();82 }83 }84 85 private void Selection_SelectionChanged(객체 전송자, EventArgs e)86 {87 this._fromMouseHover = false;88 this.MayBeAdornmentShowCondition(); 89}90
그런 다음 IWpfTextView의 Closed 이벤트를 처리할 때 이 이벤트와 같은 모든 마무리 작업을 취소해야 한다는 점에 유의해야 합니다.
세미.png(12.70 K)
2010-1-25 16:42:05
툴바.png(15.64 K)
2010-1-25 16:42:05
다음으로, 프로젝트를 컴파일하고 VSIX를 패키지합니다. 현재 구현된 주요 기능은 다음과 같습니다.
1. 코드 편집기에서 텍스트를 선택하고 마우스를 텍스트 영역으로 이동하면 QuickToolbar가 반투명한 방식으로 텍스트 옆에 "떠다닙니다".
2. 마우스를 QuickToolbar 영역으로 이동하면 QuickToolbar가 불투명해지고 그 위의 버튼이 마우스 동작에 반응합니다.
3. 현재 지원되는 작업은 다음과 같습니다.
자르다
복사
반죽
삭제
들여쓰기 줄이기
들여쓰기 늘리기
코멘트 코드(Comment)
주석 해제
등.
VSIX 및 소스 코드 다운로드 및 설치 방법은 GCDN 포럼: [VS2010 확장] 부동 도구 모음( http://gcdn.grapecity.com/showtopic-345.html )에 있습니다.
'불가능'을 '나는 가능'으로 바꾸는 아포스트로피가 되려면
------------------------------------- --
WinkingZhang의 블로그 ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )