Baru-baru ini, Ekstensi VS2010 sering disebutkan di Blog Visual Studio ( http://blogs.msdn.com/visualstudio/ ), jadi saya ingin melihat dokumentasi untuk mempelajarinya, namun setelah lama mencari, di sana tidak ada pengenalan lengkap tentang topik ini. Jadi, saya harus mencari konten yang disediakan oleh template di VS IDE dan penjelasannya di Blog Visual Studio. Saat menggunakan Reflector, saya menulis beberapa kode dan bersiap untuk latihan langsung , Saya merasa Ekstensi yang dibuat oleh template ini terlalu sederhana. Kebetulan saya melihat AxTool ( http://www.axtools.com/products-vs2010-extensions.php ) memiliki ekstensi editor kode, yang juga merupakan VS Ekstensi, jadi saya mengikuti ini dan membuatnya selangkah demi selangkah.
Pertama-tama, untuk membuat proyek Ekstensi VS, Anda perlu menginstal SDK VS2010, yang saat ini merupakan versi Beta2. Anda dapat mengunduhnya di sini: http://go.microsoft.com/fwlink/?LinkID=165597 ), Disini saya menggunakan Editor Proyek yang dibuat dengan template Text Adornment, nah saya tidak akan menulis secara detail cara membuat proyek Extension sendiri melalui template tersebut - Membangun dan menerbitkan ekstensi untuk Visual Studio 2010.
Setelah proyek dibangun, TextViewCreationListener akan dibuat secara otomatis. Antarmuka IWpfTextViewCreationListener diimplementasikan di sini, dan objek IWpfTextViewCreationListener diekspor melalui MEF:
[TextViewRole("DOCUMENT")] [Ekspor(typeof(IWpfTextViewCreationListener))] [ContentType("text")] kelas tersegel internal PETextViewCreationListener : IWpfTextViewCreationListener { void IWpfTextViewCreationListener.TextViewCreated(IWpfTextView textView) { //... } }
Dengan cara ini, VS akan memanggil metode IWpfTextViewCreationListener.TextViewCreated pada waktu yang tepat untuk memberitahukan perubahan status pengeditan teks.
Untuk memunculkan toolbar Anda sendiri, Anda juga perlu mengekspor AdornmentLayerDefinition dan menyesuaikan posisi tampilan dan urutan lapisan Perhiasan ini melalui Atribut Pesanan:
[Nama("QuickToolbarAdornmentLayer")] [Pesan(Setelah = "Teks")] [Ekspor(typeof(AdornmentLayerDefinition))] public AdornmentLayerDefinition QuickToolbarLayerDefinition { dapatkan;
Atribut Nama di sini sangat penting. Kami akan mengandalkannya untuk mendapatkan AdornmentLayer di kode mendatang:
this._adornmentLayer = this._textView.GetAdornmentLayer("QuickToolbarAdornmentLayer");
Selangkah lebih maju, mari kembali ke IWpfTextViewCreationListener.TextViewCreated. Melalui sini, Anda bisa mendapatkan IWpfTextView.
Ini adalah tujuan dan presentasi dari semua operasi. Selain itu, acara Closed, LayoutChanged, MouseHovered, SelectionChanged, dan lainnya perlu digantung untuk merespons perilaku pengguna.
Karena kita ingin mengoperasikan kode melalui toolbar, kita perlu mengimpor IEditorOperationsFactoryService melalui MEF:
[Impor] internal IEditorOperationsFactoryService EditorOperationsFactoryService { dapatkan;
Dengan cara ini, IEditorOperations dapat diperoleh melalui IEditorOperationsFactoryService.GetEditorOperations(ITextView) di IWpfTextViewCreationListener.TextViewCreated Dengannya, Anda dapat mengedit kode dengan mudah dan cepat.
Selanjutnya, kita perlu mengimplementasikan antarmuka toolbar. Saya tidak akan membahas detailnya. Cukup buat UserControl dan letakkan ToolBar di dalamnya. Jadi kapan dan dimana menampilkan ToolBar ini? Ini tergantung pada event SelectionChanged dari IWpfTextView. Event yang disebutkan di atas digunakan di sini.
kode
1 private void MayBeAdornmentShowCondition() 2 { 3 if (!this._textView.Selection.IsEmpty) 4 { 5 SnapshotPoint startPos = this._textView.Selection.Start.Position; 7 IWpfTextViewLine textViewLineContainingBufferPosition = this._textView.GetTextViewLineContainingBufferPosition(startPos); 8 TextBounds characterBounds = textViewLineContainingBufferPosition.GetCharacterBounds(startPos); 9 TextBoundsbounds2 = this._textView.GetTextViewLineContainingBufferPosition(endPos). Pos);10 jika (ini._dariMouseHover)11 {12 this._mustHaveAdornmentDisplayed = true;13 }14 else15 {16 PELeftButtonMouseProcessor property = 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 choiceBounds = !this._textView.Selection.IsReversed ? batas2 : characterBounds;31 int offset = 7;32 double top = choiceBounds.Top + (!this._textView.Selection.IsReversed ? (offset + textViewLineContainingBufferPosition.Height) : (-offset - ini ._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 kiri = this._textView.ViewportWidth - this._adornmentUI.ActualWidth;41 }42 Canvas.SetTop(this._adornmentUI, atas);43 Canvas.SetLeft( this._adornmentUI, kiri);44 karakter panjang = 0L;45 coba46 {47 karakter = this._textView.Selection.SelectedSpans[0].Span.Length;48 }49 catch50 {51 }52 this._adornmentUI.SetStatus(karakter) ;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 elemen = null;68 try69 {70 elemen = this._adornmentLayer.Elements.First<IAdornmentLayerElement>(71 (IAdornmentLayerElement ile) => ile.Tag.ToString() == this._adornmentTag); 72 }73 catch (InvalidOperationException)74 {75 }76 if (elemen == 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 choice_SelectionChanged(pengirim objek, EventArgs e)86 {87 this._fromMouseHover = false;88 this.MayBeAdornmentShowCondition(); 89}90
Maka perlu diperhatikan bahwa saat menangani event Tertutup IWpfTextView, Anda harus ingat untuk membatalkan semua pekerjaan finishing seperti event ini.
semi.png(12,70 K)
25-1-2010 16:42:05
bilah alat.png(15.64K)
25-1-2010 16:42:05
Selanjutnya kompilasi proyek dan paket VSIX. Fitur utama yang saat ini diterapkan adalah:
1. Saat Anda memilih sepotong teks di editor kode dan menggerakkan mouse ke area teks, QuickToolbar akan "mengambang" di samping teks secara semi-transparan.
2. Saat mouse bergerak ke area QuickToolbar, QuickToolbar akan menjadi buram, dan tombol di dalamnya akan merespons tindakan mouse.
3. Operasi yang didukung saat ini adalah:
Memotong
Menyalin
Pasta
Menghapus
Kurangi Indentasi
Tingkatkan Indentasi
Kode komentar (Komentar)
Batalkan komentar
dll.
VSIX dan metode pengunduhan dan pemasangan kode sumber ada di forum GCDN: [Ekstensi VS2010] Bilah Alat Mengambang ( http://gcdn.grapecity.com/showtopic-345.html )
Menjadi apostrof yang mengubah “Mustahil” menjadi “Saya mungkin”
--------------------------------------------------- --
Blog WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )