Partilhar via


Estendendo o editor do Visual Studio com uma nova margem

As margens da exibição de texto são colocadas em um contêiner de margem (consulte ContainerMarginPlacement.KnownValues) e ordenadas antes ou depois relativamente a outras margens (consulte MarginPlacement.KnownValues).

Os provedores de margem de exibição de texto implementam a interface ITextViewMarginProvider, configuram a margem que fornecem implementando TextViewMarginProviderConfiguration e, quando ativados, fornecem controle de interface do usuário para ser hospedado na margem por meio de CreateVisualElementAsync.

Como as extensões no VisualStudio.Extensibility podem estar fora do processo do Visual Studio, não podemos usar diretamente o WPF como uma camada de apresentação para conteúdo de margens de exibição de texto. Em vez disso, fornecer um conteúdo para uma margem de exibição de texto requer a criação de um RemoteUserControl e o modelo de dados correspondente para esse controle. Embora existam alguns exemplos simples abaixo, recomendamos a leitura da documentação da interface do usuário remota ao criar conteúdo de margem de exibição de texto da interface do usuário.

/// <summary>
/// Configures the margin to be placed to the left of built-in Visual Studio line number margin.
/// </summary>
public TextViewMarginProviderConfiguration TextViewMarginProviderConfiguration => new(marginContainer: ContainerMarginPlacement.KnownValues.BottomRightCorner)
{
    Before = new[] { MarginPlacement.KnownValues.RowMargin },
};

/// <summary>
/// Creates a remotable visual element representing the content of the margin.
/// </summary>
public async Task<IRemoteUserControl> CreateVisualElementAsync(ITextViewSnapshot textView, CancellationToken cancellationToken)
{
    var documentSnapshot = await textView.GetTextDocumentAsync(cancellationToken);
    var dataModel = new WordCountData();
    dataModel.WordCount = CountWords(documentSnapshot);
    this.dataModels[textView.Uri] = dataModel;
    return new MyMarginContent(dataModel);
}

Além de configurar o posicionamento da margem, os provedores de margem de exibição de texto também podem configurar o tamanho da célula de grade na qual a margem deve ser colocada usando GridCellLength e propriedades de GridUnitType.

As margens da exibição de texto normalmente visualizam alguns dados relacionados à exibição de texto (por exemplo, o número da linha atual ou a contagem de erros), portanto, a maioria dos provedores de margem de exibição de texto também gostaria de ouvir eventos de exibição de texto reagir à abertura, fechamento de exibições de texto e digitação do usuário.

O Visual Studio cria apenas uma instância do seu provedor de margem de vista de texto, independentemente de quantas vistas de texto aplicáveis um utilizador abre, portanto, se a sua margem exibir alguns dados de estado, o seu provedor precisará manter o estado das vistas de texto atualmente abertas.

Para obter mais informações, consulte exemplo de margem de contagem de palavras.

As margens de exibição de texto vertical cujo conteúdo precisa ser alinhado com as linhas de exibição de texto ainda não são suportadas.