Обучение
Схема обучения
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization
Этот браузер больше не поддерживается.
Выполните обновление до Microsoft Edge, чтобы воспользоваться новейшими функциями, обновлениями для системы безопасности и технической поддержкой.
Существуют различные типы CodeLenses, которые можно создать. Каждый тип предлагает собственный уникальный набор функциональных возможностей. В следующем разделе описано, как предоставить каждый из этих типов CodeLenses.
** CodeLens в текстовом представлении предоставляет текстовые сведения сегментам кода и является самой простой формой CodeLens. В следующих понятиях показано, как создать текстовое представление CodeLens:
ICodeLensProvider
интерфейс является основным интерфейсом для реализации. Реализация этого интерфейса определяет, когда будет активирован CodeLens, и к каким сегментам кода применяется CodeLens, и как он будет отображаться.ICodeLensProvider
необходимо определить, когда необходимо активировать CodeLens, реализуя CodeLensProviderConfiguration
.TryCreateCodeLensAsync
. Этот метод будет выполняться при активации CodeLens. В этом методе вы можете определить, как и когда должен отображаться CodeLens. Этот метод возвращает экземпляр CodeLens
.CodeLens
, где можно определить способ отображения текста с помощью метода GetLabelAsync
. Этот метод возвращает экземпляр CodeLensLabel
, который можно использовать для настройки текста, подсказки и дополнительного значка.Вызываемый CodeLens позволяет расширениям выполнять некоторые действия (например, запустить модульный тест), когда пользователь щелкает CodeLens. Расширения могут способствовать вызову функций CodeLens, реализовав InvokableCodeLens
, который является производным от CodeLens
.
Visual CodeLens позволяет расширениям предоставлять пользовательский интерфейс, такой как список ссылок на метод, который отображается во всплывающем окне над CodeLens, когда пользователь щелкает по CodeLens. Расширения могут вносить свой вклад в visual CodeLens, реализуя VisualCodeLens
, которая является производным от CodeLens
. Аналогично полям представления текста, поскольку расширения в VisualStudio.Extensibility могут работать вне процесса Visual Studio, визуальные CodeLenses предоставляют пользовательский интерфейс, создавая элемент типа RemoteUserControl
и соответствующий шаблон данных для этого элемента управления. Хотя в следующих разделах приведены некоторые простые примеры, мы рекомендуем ознакомиться с документацией по удаленному пользовательскому интерфейсу при создании содержимого пользовательского интерфейса Visual CodeLens.
В следующем примере кода показано, как создать текстовое представление CodeLens и вызываемый элемент CodeLens.
public TextViewExtensionConfiguration TextViewExtensionConfiguration => new()
{
AppliesTo = new[]
{
DocumentFilter.FromDocumentType(DocumentType.KnownValues.Code),
},
};
public CodeLensProviderConfiguration CodeLensProviderConfiguration =>
new("CodeLens Sample Provider") {};
public Task<CodeLens?> TryCreateCodeLensAsync(CodeElement codeElement, CodeElementContext codeElementContext, CancellationToken token)
{
if (codeElement.Kind == CodeElementKind.KnownValues.Method)
{
return Task.FromResult<CodeLens?>(new ClickableCodeLens(codeElement, this.Extensibility));
}
return Task.FromResult<CodeLens?>(new WordCountCodeLens(codeElement, codeElementContext, this.Extensibility, this));
}
...
public class ClickableCodeLens : InvokableCodeLens
{
public override Task ExecuteAsync(CodeElementContext codeElementContext, IClientContext clientContext, CancellationToken cancelToken)
{
this.clickCount++;
this.Invalidate();
return Task.CompletedTask;
}
public override Task<CodeLensLabel> GetLabelAsync(CodeElementContext codeElementContext, CancellationToken token)
{
return Task.FromResult(new CodeLensLabel()
{
Text = this.clickCount == 0 ? "Click me" : $"Clicked {this.clickCount} times",
Tooltip = "Invokable CodeLens Sample Tooltip",
});
}
}
public class WordCountCodeLens : VisualCodeLens
{
public override Task<IRemoteUserControl> GetVisualizationAsync(CodeElementContext codeElementContext, IClientContext clientContext, CancellationToken token)
{
return Task.FromResult<IRemoteUserControl>(new WordCountCodeLensVisual(this.wordCountData));
}
public override Task<CodeLensLabel> GetLabelAsync(CodeElementContext codeElementContext, CancellationToken token)
{
this.wordCountData.WordCount = CountWords(codeElementContext.Range);
return Task.FromResult(new CodeLensLabel()
{
Text = $"Words: {this.wordCountData.WordCount}",
Tooltip = "Number of words in this code element",
});
}
}
Помимо настройки отображаемого имени поставщика CodeLens, поставщики CodeLens также могут настроить приоритет своих CodeLens. Значение приоритета используется для определения относительного упорядочения CodeLens, соответствующего другим CodeLenses, которое можно задать с помощью свойства Priority
в объекте CodeLensProviderConfiguration
.
CodeLenses обычно визуализирует некоторые данные, связанные с текстовым представлением. Например, может потребоваться отобразить количество ссылок на метод. Для этого поставщик CodeLens также должен отслеживать события текстового представления, реагировать на открытие, закрытие текстовых представлений и ввод текста пользователями.
Visual Studio создаёт только один экземпляр поставщика CodeLens вне зависимости от того, сколько соответствующих текстовых представлений открывает пользователь. Это означает, что если вашему CodeLens необходимо поддерживать состояние, убедитесь, что его поставщик имеет способ сохранить состояние открытых текстовых представлений.
Дополнительные сведения см. в примере CodeLens.
Если поставщик Code Lens должен ссылаться на элементы кода, которые еще не помечены существующей функцией Visual Studio, можно создать новый теггер , реализующий ITextViewTaggerProvider<CodeLensTag>
, с помощью.
Обучение
Схема обучения
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization