Поделиться через


Точки расширения редактора

Редактор предоставляет точку расширения, которые можно расширить, как управляемые части .NET Framework расширяемости (компонент MEF). Эти основные категории точки расширения:

  • Типы содержимого

  • Типы классификации и форматов классификации

  • Поля и scrollbars

  • Теги

  • Элементы оформления

  • Процессоры мыши

  • Обработчики перетаскивания

  • Параметры

  • IntelliSense

Расширение типы содержимого

Типы содержимого текста определения типов обрабатываются редактором (например, «текст», «код» и «CSharp». Указывается тип содержимого, объявление переменной типа ContentTypeDefinition и предоставление тип содержимого уникальное имя. Чтобы зарегистрировать тип содержимого с редактором, экспортировать его вместе с следующими атрибутами:

  • NameAttribute имя типа содержимого.

  • BaseDefinitionAttribute имя типа содержимого, с которого данный тип содержимого получается. Тип содержимого может наследовать от нескольких других типов содержимого.

Поскольку класс ContentTypeDefinition запечатан, можно экспортировать без параметра типа.

В следующем примере показаны атрибуты экспорта в определении типа содержимого.

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

Типы содержимого может основываться на ноль или более существующих типов содержимого. Эти встроенные типы:

  • Любые: тип базового содержания. Родительский объект для всех других типов содержимого.

  • Текст: базовый тип для содержимого non-проекции. Наследует от «любой».

  • Открытый текст: для текста non-кода. Наследует от «текст».

  • Код: для кода всех типов. Наследует от «текст».

  • Инертно: исключает текст из любого типа обработки. Текст данного типа содержимого никогда не будет иметь ни одно из расширений, примененное к нему.

  • Проекция: для содержимого буферов проекции. Наследует от «любой».

  • Intellisense. для содержимого IntelliSense. Наследует от «текст».

  • Sighelp: справка сигнатуры. Наследует от «intellisense».

  • Sighelp-doc: документация справки сигнатуры. Наследует от «intellisense».

Некоторые из этих типов содержимого, которые определены Visual Studio и некоторые языки, размещенных в Visual Studio:

  • Basic

  • C/C++

  • ConsoleOutput

  • CSharp

  • CSS

  • ENCL

  • FindResults

  • F#

  • HTML

  • JScript

  • язык XAML

  • XML

Для получения списка доступных типов содержимого, импортировать IContentTypeRegistryService, поддерживающий коллекцию типов содержимого для редактора. В следующем примере кода будет импортировать эту службу в качестве свойства.

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

Чтобы связать тип содержимого с расширением имени файла используйте FileExtensionToContentTypeDefinition.

Примечание

В Visual Studio расширения имени файла зарегистрированы с помощью ProvideLanguageExtensionAttribute в пакете языковой службы.FileExtensionToContentTypeDefinition связывает тип содержимого MEF с расширением имени файла, которое было зарегистрировано подобным образом.

Чтобы экспортировать расширение имени файла к определению типа содержимого, необходимо включить следующие атрибуты:

Поскольку класс FileExtensionToContentTypeDefinition запечатан, можно экспортировать без параметра типа.

В следующем примере показаны атрибуты экспорта с расширением имени файла к определению типа содержимого.

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

IFileExtensionRegistryService управляет ассоциации между расширениями имен файлов и типами содержимого.

Расширение типов классификации и форматов классификации

Можно использовать типы классификации для указания типов текста, для которых нужно предоставить другой обработки (например, красящ текст «ключевое слово» синий и зеленый цвет текста «примечания»). Определите новый тип классификации путем объявления переменной типа ClassificationTypeDefinition и передачей ему уникальное имя.

Чтобы зарегистрировать тип классификации с редактором, экспортировать его вместе с следующими атрибутами:

  • NameAttribute: имя типа классификации.

  • BaseDefinitionAttribute: имя типа классификации, от которого наследуется этот тип классификации. Все типы классификации наследуют от «текст», а тип классификации может наследовать от нескольких других типов классификации.

Поскольку класс ClassificationTypeDefinition запечатан, можно экспортировать без параметра типа.

В следующем примере показаны атрибуты экспорта в определении типа классификации.

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

IStandardClassificationService предоставляет доступ к стандартным классификациям. Встроенные типы классификации включают эти:

  • "text"

  • «естественный язык» (наследуется от «текст»)

  • Офизиальный «язык» (наследуется от «текст»)

  • «строка» является производным от литерала («»)

  • «символ» (наследуется от «литерала»)

  • Числовые» («является производным от «литерала»)

Набор отличающихся типов ошибок наследуется от ErrorTypeDefinition. Сюда входят типы об ошибке:

  • «синтаксическая ошибка»

  • «ошибка компилятора»

  • «другая ошибка»

  • «предупреждение»

Для получения списка доступных типов классификации, импортировать IClassificationTypeRegistryService, поддерживающий коллекцию типов классификации для редактора. В следующем примере кода будет импортировать эту службу в качестве свойства.

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

Можно указать определение формата классификации нового типа классификации. Создайте класс, наследуемый от ClassificationFormatDefinition и экспортировать его с типом EditorFormatDefinition вместе с следующими атрибутами:

  • NameAttribute: имя формата.

  • DisplayNameAttribute: отображаемое имя формата.

  • UserVisibleAttribute: указывает, отображается ли формат на странице Шрифты и цвета диалогового окна Параметры.

  • OrderAttribute: преимущество формата. Допустимые значения: от Priority.

  • ClassificationTypeAttribute: имя типа классификации, к которому сопоставлен этот формат.

В следующем примере показаны атрибуты экспорта определения формата классификации.

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

Для получения списка доступных форматов, импортировать IEditorFormatMapService, поддерживающий коллекцию форматов для редактора. В следующем примере кода будет импортировать эту службу в качестве свойства.

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

Расширение поля и Scrollbars

Поля и полосы прокрутки в основном элементы самого представления редактора в дополнение к представлению текста. Можно ввести любое число полей в дополнение к стандартным полей вокруг представления текста.

Реализуйте интерфейс IWpfTextViewMargin для определения полей. Необходимо также реализовать интерфейс IWpfTextViewMarginProvider, чтобы создать поля.

Чтобы зарегистрировать поставщик полей с редактором, необходимо экспортировать поставщика вместе с следующими атрибутами:

  • NameAttribute: имя поля.

  • OrderAttribute: порядок, в котором поля отображаются по отношению к другим полям.

    Эти встроенные поля:

    • «Wpf горизонтальная полоса прокрутки»

    • «Вертикальная полоса прокрутки Wpf»

    • Номер линии Wpf «поля»

    Горизонтальные поля, имеющие атрибут order After="Wpf Horizontal Scrollbar" отображаются под встроенными полями и горизонтальными полями, имеющие атрибут order Before ="Wpf Horizontal Scrollbar" отображаются над встроенными полями. Правое вертикальные поля, имеющие атрибут order After="Wpf Vertical Scrollbar" отображаются справа от полосы прокрутки. Левые вертикальные поля, имеющие атрибут order After="Wpf Line Number Margin" стоять слева от поля номера линии (если они доступны).

  • MarginContainerAttribute: тип поля (левый, выпрямите, верхний или нижний).

  • ContentTypeAttribute: тип содержимого (например, «text» или «код»), для которого поля допустимы.

В следующем примере показаны атрибуты экспорта в поставщике полей для полей, которые отображаются справа от поля номера линии.

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

Расширение теги

Теги способ связать данные с различными типами текста. Во многих случаях связанные данные отображаются как визуальный эффект, но не все теги имеют визуальное представление. Можно указать собственный тип тегов путем реализации ITag. Необходимо также реализовать ITagger для предоставления тегов для данного набора диапазонов текста и ITaggerProvider для предоставления средство создания тегов для. Необходимо экспортировать поставщик средство создания тегов для вместе с следующими атрибутами:

  • ContentTypeAttribute: тип содержимого (например, «text» или «код»), для которого данный тег допустимым.

  • TagTypeAttribute: тип тега.

В следующем примере показаны атрибуты в поставщике средство создания тегов для экспорта.

[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TagType(typeof(TestTag))]
internal class TestTaggerProvider : ITaggerProvider

Следующие типы тегов встроенный:

Для нахождения и использование тегов для буфера и представлений, импортировать IViewTagAggregatorFactoryService или IBufferTagAggregatorFactoryService, которые предоставляют ITagAggregator запрошенного типа. В следующем примере кода будет импортировать эту службу в качестве свойства.

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

Теги и MarkerFormatDefinitions

Можно расширить класс MarkerFormatDefinition, чтобы задать внешний вид тега. Необходимо экспортировать класс (например EditorFormatDefinition) со следующими атрибутами:

  • NameAttribute: имя, используемое для ссылки на этот формат

  • UserVisibleAttribute: это приводит к тому, что формат отображаться в пользовательском интерфейсе

В конструкторе можно указать отображаемое имя и внешний вид тега. BackgroundColor определяет цвет заливки и ForegroundColor задает цвет границы. DisplayName локализуемое имя определения формата.

Ниже приводится пример определения формата:

[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;
    }
}

Чтобы применить это определение формата в тег, имя установке в атрибут имени класса (не отображаемого имени).

Примечание

Пример MarkerFormatDefinition см. в описании класса HighlightWordFormatDefinition Пошаговое руководство: Выделение текста.

Расширение крайние элементы

Элементы оформления определяют визуальные эффекты, которые могут быть добавлены к этому текст, отображаемый в представлении текста или к самому представлению текста. Можно указать собственный оформление, как любой тип UIElement.

В классе элемента оформления, необходимо объявить AdornmentLayerDefinition. Для регистрации слой оформлений, экспортировать его вместе с следующими атрибутами:

  • NameAttribute: имя элемента оформления.

  • OrderAttribute: упорядочение крайнего элемента относительно других уровнях элемента оформления. Класс PredefinedAdornmentLayers определяет 4 по умолчанию уровня: Выделение, структурирование, курсор и текст.

В следующем примере показаны атрибуты экспорта определение слоев оформлений.

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

Необходимо создать второй класс, реализующий IWpfTextViewCreationListener и обрабатывает его событие TextViewCreated, создав крайний элемент. Необходимо экспортировать этот класс вместе с следующими атрибутами:

  • ContentTypeAttribute: тип содержимого (например, «text» или «код»), для которого у оформления допустимым.

  • TextViewRoleAttribute: тип представления текста, для которого данный крайний элемент является допустимым. Класс PredefinedTextViewRoles имеет набор предопределенных ролей представления текста. Например, Document главным образом используется для представления текста файлов. Interactive используется для представления текста, которые пользователь может изменить либо переход с помощью мыши и клавиатуры. Примеры представлений Interactive текстовое представление редактора и окно Вывод.

В следующем примере показаны атрибуты экспорта в поставщике элемента оформления.

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

Крайний элемент космическая-обсуждая, занимающий место на том же уровне, что текст. Чтобы создать этот тип элемента оформления, необходимо задать класс, производный от SpaceNegotiatingAdornmentTag тега, который указывает отступ крайний элемент занимает.

Как и для всех крайними элементами необходимо экспортировать определение слоев оформлений.

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

Для создания космическая-обсуждая оформление, необходимо создать класс, реализующий ITaggerProvider, в дополнение к классу, реализующему IWpfTextViewCreationListener (как и в случае с другими типами оформлений).

Чтобы зарегистрировать поставщик средство создания тегов для необходимо экспортировать вместе с следующими атрибутами:

  • ContentTypeAttribute: тип содержимого (например, «text» или «код»), для которого данный крайний элемент является допустимым.

  • TextViewRoleAttribute: тип представления текста, для которого эти тега или оформление допустимым. Класс PredefinedTextViewRoles имеет набор предопределенных ролей представления текста. Например, Document главным образом используется для представления текста файлов. Interactive используется для представления текста, которые пользователь может изменить либо переход с помощью мыши и клавиатуры. Примеры представлений Interactive текстовое представление редактора и окно Вывод.

  • TagTypeAttribute: тип тега или крайний элемент, который определен. Необходимо добавить секунду TagTypeAttribute для SpaceNegotiatingAdornmentTag.

В следующем примере показаны атрибуты экспорта в поставщике средство создания тегов для космическая-обсуждая тега для элемента оформления.

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

Расширение процессоры мыши

Можно добавить специальной обработки ввода мыши. Создайте класс, наследуемый от MouseProcessorBase и переопределите события мыши, для входа необходимо обработать. Необходимо также реализовать IMouseProcessorProvider во втором классе и экспортировать его вместе с ContentTypeAttribute, указывающее тип содержимого (например, «text» или «код»), для которого обработчик мыши является допустимым.

В следующем примере показаны атрибуты экспорта в поставщике процессора мыши.

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

Расширение обработчики перетаскивания

Можно настраивать функциональности обработчиков удаления для определенных типов текста путем создания класса, реализующего IDropHandler и второй класс, реализующий IDropHandlerProvider, чтобы создать обработчик перетаскивания. Необходимо экспортировать обработчик удаления вместе с следующими атрибутами:

  • DropFormatAttribute: формат текста, для которого этот обработчик удаления является допустимым. Следующие форматы обрабатываются в порядке приоритетов от самого высокого до самого низкого:

    1. Любой пользовательский формат

    2. FileDrop

    3. EnhancedMetafile

    4. WaveAudio

    5. Импровизация

    6. Dif

    7. Языковые стандарты

    8. Палитра

    9. PenData

    10. Serializable

    11. SymbolicLink

    12. Xaml

    13. XamlPackage

    14. Tiff

    15. Растровое изображение

    16. Dib

    17. MetafilePicture

    18. CSV

    19. System.String

    20. Формат HTML

    21. UnicodeText

    22. OEMText

    23. Текст

  • NameAttribute: имя обработчика удаления.

  • OrderAttribute: упорядочение обработчика удаления до или после обработчика по умолчанию. По умолчанию модуль удаления для Visual Studio называется «DefaultFileDropHandler».

В следующем примере показаны атрибуты экспорта в поставщике обработчика удаления.

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

Расширение параметры редактора

Можно указать параметры быть допустимым только в определенной области, например в представлении текста. Редактор предоставляет набор предопределенных вариантов: параметры редактора, параметры представления и представление Windows Presentation Foundation (WPF) параметров. Эти параметры можно найти в DefaultOptions, DefaultTextViewOptions и DefaultWpfViewOptions.

Чтобы добавить новый параметр, необходимо наследовать класс от одного из этих классов определения параметров:

В следующем примере показано, как экспортировать определение параметра, имеющего значение типа boolean.

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

Расширение технологии IntelliSense

IntelliSense общая термина для группы в составе функции, предоставляющие сведения о структурированном текста и завершения выписки для него. Эти функции включают завершение выписки, справка сигнатуры быстрое сведения и смарт-тегов. Пользователи выписки помогает завершения введите ключевое слово или имя языка. Справка сигнатуры указывающее подпись или подписи для метода, который пользователь просто типизированные. Быстрые отображает полное подпись сведения для типа или имени, когда указатель мыши отдохнет. Смарт-теги предоставляют дополнительные действия для некоторых идентификаторов в некоторых контекстах, например переименование все вхождения переменной после того как одно вхождение было переименовано.

Конструкция функции IntelliSense во многом же во всех случаях:

  • Брокер IntelliSense отвечает за общего процесса.

  • Сеанс IntelliSense представляет последовательность событий между активировать средства отображения и committal или отменой выбора. Сеанс обычно активирован некоторым жестом пользователя.

  • Контроллер IntelliSense отвечает за определение, когда сеанс должен начинаться и заканчиваться. Он также решает, когда информация должна быть зафиксирована и когда сеанс должен быть отменена.

  • Источник IntelliSense предоставляет содержимого и выбирает наилучшее совпадение.

  • Средство отображения IntelliSense отвечает за отображение содержимого.

В большинстве случаев рекомендуется указывать хотя бы источник и контроллер. Можно также предоставить средство отображения если необходимо настраивать отображение.

Реализация источник IntelliSense

Настраивать источник, необходимо реализовать один (или более) из из следующих интерфейсов источника:

Кроме того, необходимо реализовать поставщик того же типа.

Необходимо экспортировать поставщика вместе с следующими атрибутами:

  • NameAttribute: имя источника.

  • ContentTypeAttribute: тип содержимого (например, «text» или «код»), к которому применяется источника.

  • OrderAttribute: порядок, в котором источник должен появиться (по отношению к другим источникам).

  • В следующем примере показаны атрибуты экспорта в поставщике источника завершения.

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

Дополнительные сведения о реализации источники IntelliSense см. в следующих пошаговых руководствах:

Пошаговое руководство: QuickInfo отображение всплывающих подсказок

Пошаговое руководство: Отображение справки подпись

Пошаговое руководство: Завершение операторов отображение

Реализация контроллер IntelliSense

Настраивать контроллер, необходимо реализовать интерфейс IIntellisenseController. Кроме того, необходимо реализовать поставщик контроллера вместе с следующими атрибутами:

  • NameAttribute: имя контроллера.

  • ContentTypeAttribute: тип содержимого (например, «text» или «код»), к которому применяется контроллер.

  • OrderAttribute: порядок, в котором контроллера должен появиться (относительно других контроллерам).

В следующем примере показаны атрибуты экспорта в поставщике контроллера завершения.

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

Дополнительные сведения об использовании контроллеров IntelliSense см. в следующих пошаговых руководствах:

Пошаговое руководство: QuickInfo отображение всплывающих подсказок