Bagikan melalui


Layanan bahasa dan titik ekstensi editor

Editor menyediakan titik ekstensi yang dapat Anda perluas sebagai komponen Managed Extensibility Framework (MEF), termasuk sebagian besar fitur layanan bahasa. Ini adalah kategori titik ekstensi utama:

  • Jenis konten

  • Jenis klasifikasi dan format klasifikasi

  • Margin dan bilah gulir

  • Tag

  • Hiasan

  • Prosesor mouse

  • Jatuhkan handler

  • Opsi

  • IntelliSense

Perluas tipe isi

Jenis konten adalah definisi dari jenis teks yang ditangani oleh editor, misalnya, "teks", "kode", atau "CSharp". Anda menentukan jenis konten baru dengan mendeklarasikan variabel jenis ContentTypeDefinition dan memberi tipe konten baru nama yang unik. Untuk mendaftarkan jenis konten dengan editor, ekspor bersama dengan atribut berikut:

  • NameAttribute adalah nama tipe konten.

  • BaseDefinitionAttribute adalah nama tipe isi dari mana tipe isi ini berasal. Tipe isi dapat mewarisi dari beberapa tipe isi lainnya.

    ContentTypeDefinition Karena kelas disegel, Anda dapat mengekspornya tanpa parameter jenis.

    Contoh berikut menunjukkan atribut ekspor pada definisi tipe konten.

[Export]
[Name("test")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition TestContentTypeDefinition;

Tipe konten dapat didasarkan pada nol atau lebih tipe konten yang sudah ada sebelumnya. Ini adalah jenis bawaan:

  • Any: jenis konten dasar. Induk dari semua tipe isi lainnya.

  • Teks: jenis dasar untuk konten non-proyeksi. Mewarisi dari "any".

  • Teks biasa: untuk teks non-kode. Mewarisi dari "teks".

  • Kode: untuk kode semua jenis. Mewarisi dari "teks".

  • Inert: mengecualikan teks dari segala jenis penanganan. Teks tipe isi ini tidak akan pernah memiliki ekstensi apa pun yang diterapkan padanya.

  • Proyeksi: untuk konten buffer proyeksi. Mewarisi dari "any".

  • Intellisense: untuk konten IntelliSense. Mewarisi dari "teks".

  • Sighelp: bantuan tanda tangan. Mewarisi dari "intellisense".

  • Sighelp-doc: dokumentasi bantuan tanda tangan. Mewarisi dari "intellisense".

    Ini adalah beberapa jenis konten yang ditentukan oleh Visual Studio dan beberapa bahasa yang dihosting di Visual Studio:

  • Dasar

  • C/C++

  • ConsoleOutput

  • CSharp

  • CSS

  • ENC

  • FindResults

  • F#

  • HTML

  • JScript

  • XAML

  • XML

    Untuk menemukan daftar tipe konten yang tersedia, impor IContentTypeRegistryService, yang mempertahankan kumpulan jenis konten untuk editor. Kode berikut mengimpor layanan ini sebagai properti.

[Import]
internal IContentTypeRegistryService ContentTypeRegistryService { get; set; }

Untuk mengaitkan tipe konten dengan ekstensi nama file, gunakan FileExtensionToContentTypeDefinition.

Catatan

Di Visual Studio, ekstensi nama file didaftarkan dengan menggunakan ProvideLanguageExtensionAttribute pada paket layanan bahasa. Mengaitkan FileExtensionToContentTypeDefinition tipe konten MEF dengan ekstensi nama file yang telah didaftarkan dengan cara ini.

Untuk mengekspor ekstensi nama file ke definisi tipe konten, Anda harus menyertakan atribut berikut:

[Export]
[FileExtension(".test")]
[ContentType("test")]
internal static FileExtensionToContentTypeDefinition TestFileExtensionDefinition;

mengelola IFileExtensionRegistryService asosiasi antara ekstensi nama file dan jenis konten.

Memperluas jenis klasifikasi dan format klasifikasi

Anda dapat menggunakan jenis klasifikasi untuk menentukan jenis teks yang ingin Anda berikan penanganan yang berbeda (misalnya, mewarnai teks "kata kunci" biru dan teks "komentar" berwarna hijau). Tentukan jenis klasifikasi baru dengan mendeklarasikan variabel jenis ClassificationTypeDefinition dan memberinya nama yang unik.

Untuk mendaftarkan jenis klasifikasi dengan editor, ekspor bersama dengan atribut berikut:

  • NameAttribute: nama jenis klasifikasi.

  • BaseDefinitionAttribute: nama jenis klasifikasi tempat jenis klasifikasi ini mewarisi. Semua jenis klasifikasi mewarisi dari "teks", dan jenis klasifikasi dapat diwarisi dari beberapa jenis klasifikasi lainnya.

    ClassificationTypeDefinition Karena kelas disegel, Anda dapat mengekspornya tanpa parameter jenis.

    Contoh berikut menunjukkan atribut ekspor pada definisi jenis klasifikasi.

[Export]
[Name("csharp.test")]
[BaseDefinition("test")]
internal static ClassificationTypeDefinition CSharpTestDefinition;

menyediakan IStandardClassificationService akses ke klasifikasi standar. Jenis klasifikasi bawaan meliputi:

  • "teks"

  • "bahasa alami" (berasal dari "teks")

  • "bahasa formal" (berasal dari "teks")

  • "string" (berasal dari "literal")

  • "karakter" (berasal dari "literal")

  • "numerik" (berasal dari "literal")

    Sekumpulan jenis kesalahan yang berbeda diwarisi dari ErrorTypeDefinition. Mereka termasuk jenis kesalahan berikut:

  • "kesalahan sintaks"

  • "kesalahan kompilator"

  • "kesalahan lainnya"

  • "peringatan"

    Untuk menemukan daftar jenis klasifikasi yang tersedia, impor IClassificationTypeRegistryService, yang mempertahankan kumpulan jenis klasifikasi untuk editor. Kode berikut mengimpor layanan ini sebagai properti.

[Import]
internal IClassificationTypeRegistryService ClassificationTypeRegistryService { get; set; }

Anda dapat menentukan definisi format klasifikasi untuk jenis klasifikasi baru Anda. Dapatkan kelas dari ClassificationFormatDefinition dan ekspor dengan jenis EditorFormatDefinition, bersama dengan atribut berikut:

[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = "test")]
[Name("test")]
[DisplayName("Test")]
[UserVisible(true)]
[Order(After = Priority.Default, Before = Priority.High)]
internal sealed class TestFormat : ClassificationFormatDefinition

Untuk menemukan daftar format yang tersedia, impor IEditorFormatMapService, yang mempertahankan kumpulan format untuk editor. Kode berikut mengimpor layanan ini sebagai properti.

[Import]
internal IEditorFormatMapService FormatMapService { get; set; }

Memperluas margin dan bilah gulir

Margin dan bilah gulir adalah elemen tampilan utama editor selain tampilan teks itu sendiri. Anda dapat menyediakan sejumlah margin selain margin standar yang muncul di sekitar tampilan teks.

Terapkan IWpfTextViewMargin antarmuka untuk menentukan margin. Anda juga harus menerapkan IWpfTextViewMarginProvider antarmuka untuk membuat margin.

Untuk mendaftarkan penyedia margin dengan editor, Anda harus mengekspor penyedia bersama dengan atribut berikut:

  • NameAttribute: nama margin.

  • OrderAttribute: urutan munculnya margin, relatif terhadap margin lainnya.

    Ini adalah margin bawaan:

    • "Bilah Gulir Horizontal Wpf"

    • "Bilah Gulir Vertikal Wpf"

    • "Margin Nomor Baris Wpf"

      Margin horizontal yang memiliki atribut urutan ditampilkan di bawah margin bawaan After="Wpf Horizontal Scrollbar" , dan margin horizontal yang memiliki atribut Before ="Wpf Horizontal Scrollbar" urutan ditampilkan di atas margin bawaan. Margin vertikal kanan yang memiliki atribut After="Wpf Vertical Scrollbar" urutan ditampilkan di sebelah kanan bilah gulir. Margin vertikal kiri yang memiliki atribut After="Wpf Line Number Margin" urutan muncul di sebelah kiri margin nomor baris (jika terlihat).

  • MarginContainerAttribute: jenis margin (kiri, kanan, atas, atau bawah).

  • ContentTypeAttribute: jenis konten (misalnya, "teks" atau "kode") yang margin Anda valid.

    Contoh berikut menunjukkan atribut ekspor pada penyedia margin untuk margin yang muncul di sebelah kanan margin nomor baris.

[Export(typeof(IWpfTextViewMarginProvider))]
[Name("TestMargin")]
[Order(Before = "Wpf Line Number Margin")]
[MarginContainer(PredefinedMarginNames.Left)]
[ContentType("text")]

Perluas tag

Tag adalah cara mengaitkan data dengan berbagai jenis teks. Dalam banyak kasus, data terkait ditampilkan sebagai efek visual, tetapi tidak semua tag memiliki presentasi visual. Anda dapat menentukan jenis tag Anda sendiri dengan menerapkan ITag. Anda juga harus menerapkan ITagger<T> untuk menyediakan tag untuk sekumpulan rentang teks tertentu ITaggerProvider , dan untuk menyediakan tagger. Anda harus mengekspor penyedia tagger bersama dengan atribut berikut:

  • ContentTypeAttribute: jenis konten (misalnya, "teks" atau "kode") yang tag Anda valid.

  • TagTypeAttribute: jenis tag.

    Contoh berikut menunjukkan atribut ekspor pada penyedia tagger.

<CodeContentPlaceHolder>8 Jenis tag berikut adalah bawaan:

[Import]
internal IViewTagAggregatorFactoryService ViewTagAggregatorFactoryService { get; set; }

Tag dan MarkerFormatDefinitions

Anda dapat memperluas MarkerFormatDefinition kelas untuk menentukan tampilan tag. Anda harus mengekspor kelas Anda (sebagai EditorFormatDefinition)dengan atribut berikut:

  • NameAttribute: nama yang digunakan untuk mereferensikan format ini

  • UserVisibleAttribute: ini menyebabkan format muncul di UI

    Di konstruktor, Anda menentukan nama tampilan dan tampilan tag. BackgroundColor menentukan warna isian, dan ForegroundColor menentukan warna batas. DisplayName adalah nama definisi format yang dapat dilokalkan.

    Berikut ini adalah contoh definisi format:

[Export(typeof(EditorFormatDefinition))]
[Name("MarkerFormatDefinition/HighlightWordFormatDefinition")]
[UserVisible(true)]
internal class HighlightWordFormatDefinition : MarkerFormatDefinition
{
    public HighlightWordFormatDefinition()
    {
        this.BackgroundColor = Colors.LightBlue;
        this.ForegroundColor = Colors.DarkBlue;
        this.DisplayName = "Highlight Word";
        this.ZOrder = 5;
    }
}

Untuk menerapkan definisi format ini ke tag, referensikan nama yang Anda tetapkan di atribut nama kelas (bukan nama tampilan).

Catatan

Untuk contoh MarkerFormatDefinition, lihat kelas HighlightWordFormatDefinition di Panduan: Menyoroti Teks.

Perluas hiasan

Hiasan menentukan efek visual yang dapat ditambahkan baik ke teks yang ditampilkan dalam tampilan teks atau ke tampilan teks itu sendiri. Anda dapat menentukan hiasan Anda sendiri sebagai semua jenis UIElement.

Di kelas hiasan Anda, Anda harus mendeklarasikan AdornmentLayerDefinition. Untuk mendaftarkan lapisan hiasan Anda, ekspor bersama dengan atribut berikut:

  • NameAttribute: nama hiasan.

  • OrderAttribute: urutan hiasan sehubungan dengan lapisan hiasan lainnya. Kelas PredefinedAdornmentLayers menentukan empat lapisan default: Pilihan, Kerangka, Tanda Sisipan, dan Teks.

    Contoh berikut menunjukkan atribut ekspor pada definisi lapisan hiasan.

[Export]
[Name("TestEmbeddedAdornment")]
[Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)]
internal AdornmentLayerDefinition testLayerDefinition;

Anda harus membuat kelas kedua yang mengimplementasikan IWpfTextViewCreationListener dan menangani peristiwanya TextViewCreated dengan membuat hiasan. Anda harus mengekspor kelas ini bersama dengan atribut berikut:

  • ContentTypeAttribute: jenis konten (misalnya, "teks" atau "kode") di mana hiasan valid.

  • TextViewRoleAttribute: jenis tampilan teks di mana hiasan ini valid. PredefinedTextViewRoles Kelas ini memiliki sekumpulan peran tampilan teks yang telah ditentukan sebelumnya. Misalnya, Document terutama digunakan untuk tampilan teks file. Interactive digunakan untuk tampilan teks yang dapat diedit atau dinavigasi pengguna dengan menggunakan mouse dan keyboard. Interactive Contoh tampilan adalah tampilan teks editor dan jendela Output.

    Contoh berikut menunjukkan atribut ekspor pada penyedia hiasan.

[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("csharp")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal sealed class TestAdornmentProvider : IWpfTextViewCreationListener

Hiasan negosiasi spasi adalah hiasan yang menempati ruang pada tingkat yang sama dengan teks. Untuk membuat hiasan semacam ini, Anda harus menentukan kelas tag yang mewarisi dari SpaceNegotiatingAdornmentTag, yang menentukan jumlah ruang yang diduduki oleh hiasan.

Seperti semua hiasan, Anda harus mengekspor definisi lapisan hiasan.

[Export]
[Name("TestAdornment")]
[Order(After = DefaultAdornmentLayers.Text)]
internal AdornmentLayerDefinition testAdornmentLayer;

Untuk membuat hiasan negosiasi ruang, Anda harus membuat kelas yang mengimplementasikan ITaggerProvider, selain kelas yang mengimplementasikan IWpfTextViewCreationListener (seperti halnya jenis hiasan lainnya).

Untuk mendaftarkan penyedia tagger, Anda harus mengekspornya bersama dengan atribut berikut:

  • ContentTypeAttribute: jenis konten (misalnya, "teks" atau "kode") di mana hiasan Anda valid.

  • TextViewRoleAttribute: jenis tampilan teks yang tag atau hiasan ini valid. PredefinedTextViewRoles Kelas ini memiliki sekumpulan peran tampilan teks yang telah ditentukan sebelumnya. Misalnya, Document terutama digunakan untuk tampilan teks file. Interactive digunakan untuk tampilan teks yang dapat diedit atau dinavigasi pengguna dengan menggunakan mouse dan keyboard. Interactive Contoh tampilan adalah tampilan teks editor dan jendela Output.

  • TagTypeAttribute: jenis tag atau hiasan yang telah Anda tentukan. Anda harus menambahkan detik TagTypeAttribute untuk SpaceNegotiatingAdornmentTag.

    Contoh berikut menunjukkan atribut ekspor pada penyedia tagger untuk tag hiasan yang bernegosiasi ruang.

[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(SpaceNegotiatingAdornmentTag))]
[TagType(typeof(TestSpaceNegotiatingTag))]
internal sealed class TestTaggerProvider : ITaggerProvider

Memperluas Prosesor Mouse

Anda dapat menambahkan penanganan khusus untuk input mouse. Buat kelas yang mewarisi dari MouseProcessorBase dan mengambil alih peristiwa mouse untuk input yang ingin Anda tangani. Anda juga harus menerapkan IMouseProcessorProvider di kelas kedua dan mengekspornya bersama dengan ContentTypeAttribute yang menentukan jenis konten (misalnya, "teks" atau "kode") yang penangan mouse Anda valid.

Contoh berikut menunjukkan atribut ekspor pada penyedia prosesor mouse.

[Export(typeof(IMouseProcessorProvider))]
[Name("test mouse processor")]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Interactive)]
internal sealed class TestMouseProcessorProvider : IMouseProcessorProvider

Perluas penangan drop

Anda dapat menyesuaikan perilaku penghandel drop untuk jenis teks tertentu dengan membuat kelas yang mengimplementasikan IDropHandler dan kelas kedua yang mengimplementasikan IDropHandlerProvider untuk membuat penangan drop. Anda harus mengekspor penghandel drop bersama dengan atribut berikut:

  • DropFormatAttribute: format teks yang penangan drop-nya valid. Format berikut ditangani dalam urutan prioritas dari tertinggi ke terendah:

    1. Format kustom apa pun

    2. FileDrop

    3. EnhancedMetafile

    4. WaveAudio

    5. Riff

    6. Dif

    7. Lokal

    8. Palet

    9. PenData

    10. Serializable

    11. SymbolicLink

    12. Xaml

    13. XamlPackage

    14. Tiff

    15. Bitmap

    16. Dib

    17. MetafilePicture

    18. CSV

    19. System.String

    20. HTML Format

    21. UnicodeText

    22. OEMText

    23. Teks

  • NameAttribute: nama handler drop.

  • OrderAttribute: pengurutan handler drop sebelum atau sesudah penghandel drop default. Handler drop default untuk Visual Studio diberi nama "DefaultFileDropHandler".

    Contoh berikut menunjukkan atribut ekspor pada penyedia drop handler.

[Export(typeof(IDropHandlerProvider))]
[DropFormat("Text")]
[Name("TestDropHandler")]
[Order(Before="DefaultFileDropHandler")]
internal class TestDropHandlerProvider : IDropHandlerProvider

Memperluas Opsi Editor

Anda dapat menentukan opsi agar valid hanya dalam cakupan tertentu, misalnya, dalam tampilan teks. Editor menyediakan serangkaian opsi yang telah ditentukan sebelumnya ini: opsi editor, opsi tampilan, dan opsi tampilan Windows Presentation Foundation (WPF). Opsi ini dapat ditemukan di DefaultOptions, DefaultTextViewOptions, dan DefaultWpfViewOptions.

Untuk menambahkan opsi baru, dapatkan kelas dari salah satu kelas definisi opsi ini:

[Export(typeof(EditorOptionDefinition))]
internal sealed class TestOption : EditorOptionDefinition<bool>

Memperluas IntelliSense

IntelliSense adalah istilah umum untuk sekelompok fitur yang menyediakan informasi tentang teks terstruktur, dan penyelesaian pernyataan untuknya. Fitur-fitur ini termasuk penyelesaian pernyataan, bantuan tanda tangan, Info Cepat, dan bola lampu. Penyelesaian pernyataan membantu pengguna mengetik kata kunci bahasa atau nama anggota dengan benar. Tanda tangan membantu menampilkan tanda tangan atau tanda tangan untuk metode yang baru saja di ketik pengguna. Info Cepat menampilkan tanda tangan lengkap untuk tipe atau nama anggota saat mouse berada di atasnya. Bola lampu menyediakan tindakan tambahan untuk pengidentifikasi tertentu dalam konteks tertentu, misalnya, mengganti nama semua kemunculan variabel setelah satu kemunculan diganti namanya.

Desain fitur IntelliSense jauh sama dalam semua kasus:

  • Broker IntelliSense bertanggung jawab atas proses keseluruhan.

  • Sesi IntelliSense mewakili urutan peristiwa antara pemicu penyaji dan penerapan atau pembatalan pilihan. Sesi ini biasanya dipicu oleh beberapa gerakan pengguna.

  • Pengontrol IntelliSense bertanggung jawab untuk memutuskan kapan sesi harus dimulai dan berakhir. Ini juga memutuskan kapan informasi harus dilakukan dan kapan sesi harus dibatalkan.

  • Sumber IntelliSense menyediakan konten dan memutuskan kecocokan terbaik.

  • Penyaji IntelliSense bertanggung jawab untuk menampilkan konten.

    Dalam kebanyakan kasus, kami sarankan Anda menyediakan setidaknya sumber dan pengontrol. Anda juga dapat menyediakan penyaji jika Anda ingin menyesuaikan tampilan.

Menerapkan Sumber IntelliSense

Untuk mengkustomisasi sumber, Anda harus menerapkan satu (atau beberapa) antarmuka sumber berikut:

Penting

ISmartTagSource tidak digunakan lagi dan digantikan dengan ISuggestedActionsSource.

Selain itu, Anda harus menerapkan penyedia dengan jenis yang sama:

Penting

ISmartTagSourceProvider tidak digunakan lagi dan digantikan dengan ISuggestedActionsSourceProvider.

Anda harus mengekspor penyedia bersama dengan atribut berikut:

  • NameAttribute: nama sumber.

  • ContentTypeAttribute: jenis konten (misalnya, "teks" atau "kode") yang diterapkan sumber.

  • OrderAttribute: urutan sumber akan muncul (sehubungan dengan sumber lain).

  • Contoh berikut menunjukkan atribut ekspor pada penyedia sumber penyelesaian.

Export(typeof(ICompletionSourceProvider))]
[Name(" Test Statement Completion Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestCompletionSourceProvider : ICompletionSourceProvider

Untuk informasi selengkapnya tentang menerapkan sumber IntelliSense, lihat panduan berikut ini:

Menerapkan pengontrol IntelliSense

Untuk menyesuaikan pengontrol, Anda harus mengimplementasikan IIntellisenseController antarmuka. Selain itu, Anda harus menerapkan penyedia pengontrol bersama dengan atribut berikut:

  • NameAttribute: nama pengontrol.

  • ContentTypeAttribute: jenis konten (misalnya, "teks" atau "kode") yang diterapkan pengontrol.

  • OrderAttribute: urutan pengontrol akan muncul (sehubungan dengan pengontrol lain).

    Contoh berikut menunjukkan atribut ekspor pada penyedia pengontrol penyelesaian.

Export(typeof(IIntellisenseControllerProvider))]
[Name(" Test Controller Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestIntellisenseControllerProvider : IIntellisenseControllerProvider

Untuk informasi selengkapnya tentang menggunakan pengontrol IntelliSense, lihat panduan berikut: