最近、Visual Studio ブログ ( http://blogs.msdn.com/visualstudio/ ) で VS2010 Extension について言及されることが多くなったので、ドキュメントを調べて勉強したいと思いましたが、長い間検索した結果、ありました。このトピックについては完全な紹介ではなかったので、Reflector を使用しながら、VS IDE のテンプレートで提供されるコンテンツと、Visual Studio ブログでの説明を探して、実際の練習に備えました。 、このテンプレートで作成した拡張機能はシンプルすぎると感じたので、AxTool ( http://www.axtools.com/products-vs2010-extensions.php ) にコード エディタ拡張機能があることを偶然知りました。これも VS です。拡張機能なので、これに従って段階的に作成しました。
まず、VS Extension プロジェクトを作成するには、VS2010 SDK をインストールする必要があります。これは現在 Beta2 バージョンです ( http://go.microsoft.com/fwlink/?LinkID=165597 )。ここでは、Text Adornment テンプレートによって作成されたエディターを使用します。テンプレートを使用して独自の拡張プロジェクトを作成する方法については詳しくは書きません。これに慣れていない場合は、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 属性を使用してこの Adornment レイヤーの表示位置と順序をカスタマイズする必要もあります。
[Name("QuickToolbarAdornmentLayer")] [Order(After = "Text")] [Export(typeof(AdornmentLayerDefinition))] public AdornmentLayerDefinition QuickToolbarLayerDefinition { set;
ここでの Name 属性は非常に重要です。今後のコードで AdornmentLayer を取得するためにこれを利用します。
this._adornmentLayer = this._textView.GetAdornmentLayer("QuickToolbarAdornmentLayer");
さらに一歩進んで、IWpfTextViewCreationListener.TextViewCreated に戻りましょう。ここを通じて、IWpfTextView を取得できます。
これはすべての操作の目標であり、プレゼンテーションです。さらに、Closed、LayoutChanged、MouseHovered、SelectionChanged およびその他のイベントは、ユーザーの動作に応答するためにハングする必要があります。
ツールバーを通じてコードを操作したいため、MEF を通じて IEditorOperationsFactoryService をインポートする必要があります。
[インポート] 内部 IEditorOperationsFactoryService EditorOperationsFactoryService { セット; }
このように、IWpfTextViewCreationListener.TextViewCreated の IEditorOperationsFactoryService.GetEditorOperations(ITextView) を通じて IEditorOperations を取得できるため、コードを簡単かつ迅速に編集できます。
次に、ツールバー インターフェイスを実装する必要があります。これについては詳しく説明しませんが、UserControl を作成してそこに ToolBar を配置します。では、このツールバーをいつ、どこに表示するのでしょうか?これは IWpfTextView の SelectionChanged イベントに依存します。ここでは上記のイベントが使用されます。
コード
1 private void 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 文字境界 = textViewLineContainingBufferPosition.GetCharacterBounds(startPos); 9 TextBounds 境界 2 = this._textView.GetTextViewLineContainingBufferPosition(endPos);1 0 if (this._fromMouseHover)11 {12 this._mustHaveAdornmentDisplayed = true;13 }14 else15 {16 PELeftButtonMouseProcessor プロパティ = null;17 try18 {19 property = this._textView.Properties.GetProperty<PELeftButtonMouseProcessor>(typeof(PELeftButtonMouseProcessor));20 }21 catch22 {23 }24 this._mustHaveAdornmentDisplayed = (property != null)25 && (property.IsLeftButtonDown26 || ((DateTime.Now - property.LastLeftButtonDownTime).TotalMilliseconds < 400.0));27 }28 if (this._mustHaveAdornmentDisplayed)29 {30 TextBounds selectBounds = !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 ((left) + this._adornmentUI.ActualWidth) > this._textView.ViewportWidth)39 {40 left = this._textView.ViewportWidth - this._adornmentUI.ActualWidth;41 }42 Canvas.SetTop(this._adornmentUI, top);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 voidselection_SelectionChanged(object sender, 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. 現在サポートされている操作は次のとおりです。
カット
コピー
ペースト
消去
インデントを減らす
インデントを増やす
コメントコード(コメント)
コメントを解除する
等
VSIX およびソース コードのダウンロードとインストール方法は、GCDN フォーラムにあります: [VS2010 Extension] Floating Toolbar ( http://gcdn.grapecity.com/showtopic-345.html )
「不可能」を「可能です」に変えるアポストロフィになること
-------------------------------------------------- --
WinkingZhang のブログ ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )