Compartilhar via


Suporte para a barra de navegação (estrutura de pacote gerenciado)

A barra de navegação na parte superior do modo de exibição editor exibe os tipos e membros do arquivo. Tipos são mostrados no drop-down à esquerda, e os membros são mostrados no direito drop-down. Quando o usuário seleciona um tipo, o cursor é colocado na primeira linha do tipo. Quando o usuário seleciona um membro, o cursor é colocado na definição do membro. As caixas de lista suspensa são atualizadas para refletir o local atual do cursor.

Exibir e atualizar a barra de navegação

Para oferecer suporte a barra de navegação, você deve derivar uma classe a partir de TypeAndMemberDropdownBars de classe e implementar o OnSynchronizeDropdowns método. Quando o seu serviço de linguagem é dada uma janela de código, a base da LanguageService classe instancia o CodeWindowManager, que contém o IVsCodeWindow objeto que representa a janela de código. O CodeWindowManager objeto recebe um novo IVsTextView objeto. O CreateDropDownHelper método obtém um TypeAndMemberDropdownBars objeto. Se você retornar uma instância do seu TypeAndMemberDropdownBars classe, o CodeWindowManager chamadas seu OnSynchronizeDropdowns método para preencher o internal listas e passa sua TypeAndMemberDropdownBars o objeto para o Visual Studio suspensa barra manager. Na lista suspensa barra manager, por sua vez, chama o SetDropdownBar método no seu TypeAndMemberDropdownBars objeto para estabelecer a IVsDropdownBar objeto que contém as duas barras de menu suspenso.

Quando o cursor se move, o OnIdle chamadas de método de OnCaretMoved método. Base da OnCaretMoved chamadas de método de OnSynchronizeDropdowns método no seu TypeAndMemberDropdownBars classe para atualizar o estado da barra de navegação. Você passa um conjunto de DropDownMember objetos para este método. Cada objeto representa uma entrada na lista suspensa.

O conteúdo da barra de navegação

A barra de navegação geralmente contém uma lista de tipos e uma lista de membros. A lista de tipos inclui todos os tipos disponíveis no arquivo de origem atual. Os nomes de tipo incluem as informações de espaço para nome completo. Este é um exemplo de código de C# com dois tipos:

namespace TestLanguagePackage
{
    public class TestLanguageService
    {
        internal struct Token
        {
            int tokenID;
        }
        private Tokens[] tokens;
        private string serviceName;
    }
}

Será exibida a lista de tipos de TestLanguagePackage.TestLanguageService e TestLanguagePackage.TestLanguageService.Tokens.

A lista de membros exibe os membros disponíveis do tipo selecionado na lista de tipos. Usando o exemplo de código acima, se TestLanguagePackage.TestLanguageService é o tipo selecionado, a lista de membros conteria os membros privados tokens e serviceName. A estrutura interna Token não é exibida.

Você pode implementar a lista de membros para colocar o nome de um membro em negrito quando o cursor é colocado dentro dela. Membros também podem ser exibidos em cinza texto, indicando que não estão dentro do escopo onde o cursor é posicionado no momento.

Habilitando o suporte para a barra de navegação

Para ativar o suporte para a barra de navegação, você deve definir o ShowDropdownBarOption parâmetro da ProvideLanguageServiceAttribute para o atributo true. Este parâmetro define o ShowNavigationBar propriedade. Para oferecer suporte a barra de navegação, você deve implementar a TypeAndMemberDropdownBars de objeto na CreateDropDownHelper método na LanguageService classe.

Na sua implementação da CreateDropDownHelper método, se a ShowNavigationBar propriedade estiver definida como true, você pode retornar um TypeAndMemberDropdownBars objeto. Se você retornar o objeto, a barra de navegação não é exibida.

A opção para mostrar a barra de navegação pode ser definida pelo usuário, portanto, é possível para esse controle a ser redefinido enquanto o modo de edição está aberto. O usuário deve fechar e reabrir a janela do editor antes da alteração ocorre.

Implementando o suporte para a barra de navegação

O OnSynchronizeDropdowns método usa duas listas (um para cada lista suspensa) e dois valores, que representa a seleção atual em cada lista. As listas e os valores de seleção podem ser atualizados, caso em que o OnSynchronizeDropdowns método deve retornar true para indicar que as listas foram alterados.

Como a seleção é alterada em tipos de lista suspensa, a lista de membros deve ser atualizada para refletir o novo tipo. O que é mostrado na lista de membros pode ser:

  • A lista de membros para o tipo atual.

  • Todos os membros disponíveis na fonte de arquivo, mas com todos os membros não está no tipo de atual exibido em texto acinzentado. O usuário ainda pode selecionar os membros acinzentada, para que eles podem ser usados para navegação rápida, mas a cor indica que não são parte do tipo selecionado no momento.

Uma implementação de OnSynchronizeDropdowns método normalmente realiza as seguintes etapas:

  1. Obtenha uma lista das declarações atuais para o arquivo de origem.

    Há várias maneiras para preencher as listas. Uma abordagem é criar um método personalizado em sua versão do LanguageService classe que chama o ParseSource método com um motivo de análise personalizada que retorna uma lista de todas as declarações. Outra abordagem seria chamar o ParseSource método diretamente a partir do OnSynchronizeDropdowns método com o motivo de análise personalizado. Uma terceira abordagem pode ser em cache declarações a AuthoringScope classe retornado pela última operação de análise completa no LanguageService de classe e recuperá-lo do OnSynchronizeDropdowns método.

  2. Preencher ou atualizar a lista de tipos.

    O conteúdo da lista de tipos pode ser atualizado quando a fonte é alterada ou se você optou por alterar o estilo do texto dos tipos com base na posição atual do cursor. Observe que essa posição é passada para o OnSynchronizeDropdowns método.

  3. Determine o tipo para selecionar na lista de tipos com base na posição atual do cursor.

    Você pode pesquisar as declarações que foram obtidas na etapa 1 para localizar o tipo que envolve a posição atual do cursor e procure na lista de tipos para esse tipo determinar seu índice para a lista de tipos.

  4. Preencher ou atualizar a lista de membros com base no tipo selecionado.

    A lista de membros reflete o que é exibido no momento o membros drop-down. O conteúdo da lista de membros talvez precise ser atualizado se a origem foi alterada ou se você estiver exibindo apenas os membros do tipo selecionado e o tipo selecionado foi alterado. Se você optar por exibir todos os membros no arquivo de origem, em seguida, o estilo do texto de cada membro da lista precisa ser atualizado se o tipo selecionado no momento foi alterado.

  5. Determine o membro para selecionar na lista de membros com base na posição atual do cursor.

    Pesquisar as declarações que foram obtidas na etapa 1 para o membro que contém a posição atual do cursor e, em seguida, procure na lista de membros para esse membro determinar seu índice para a lista de membros.

  6. Retornar true se todas as alterações foram feitas para as listas ou as seleções na lista.