Compartilhar via


Inicialização do designer e configuração de metadados

A manipulação dos metadados e atributos de filtro associados a um designer ou componente de designer fornece um mecanismo para que os aplicativos definam quais ferramentas são usadas por um designer específico para lidar com objetos Type diferentes (como estruturas de dados, classes ou entidades gráficas) quando o designer está disponível e como o IDE do Visual Studio é configurado para dar suporte ao designer (por exemplo, qual categoria ou guia da Caixa de Ferramentas está disponível).

O SDK do Visual Studio fornece vários mecanismos para facilitar o controle da inicialização de um designer ou componente de designer e a manipulação de seus metadados por um VSPackage.

Inicializar metadados e informações de configuração

Como eles são carregados sob demanda, os VSPackages podem não ter sido carregados pelo ambiente do Visual Studio antes da instanciação de um designer. Portanto, o VSPackages não pode usar o mecanismo padrão para configurar um designer ou componente de designer na criação, que é manipular um evento DesignerCreated. Em vez disso, um VSPackage implementa uma instância da interface DesignSurfaceExtension e se registra para fornecer personalizações, conhecidas como extensões de superfície de design.

Personalizar inicialização

A personalização de um designer, um componente ou uma superfície de designer envolve:

  1. Modificar os metadados do designer e alterar a forma como um Type determinado é acessado ou convertido de forma eficiente.

    Isso normalmente é feito por meio dos mecanismos UITypeEditor ou TypeConverter.

    Por exemplo, quando designers baseados no System.Windows.Forms são inicializados, o ambiente do Visual Studio modifica os objetos UITypeEditor para Image usados com o designer para usar o gerenciador de recursos para obter bitmaps em vez do sistema de arquivos.

  2. Integração com o ambiente, por exemplo, assinando eventos ou obtendo informações de configuração do projeto. Você pode obter informações de configuração do projeto e assinar eventos obtendo a interface ITypeResolutionService.

  3. Modificação do ambiente do usuário ativando as categorias apropriadas da Caixa de Ferramentas ou restringindo a aplicabilidade do designer aplicando uma instância da classe ToolboxItemFilterAttribute ao designer.

Inicialização do designer por um VSPackage

Um VSPackage deve lidar com a inicialização do designer da seguinte forma:

  1. Criando um objeto que implemente a classe DesignSurfaceExtension.

    Observação

    A classe DesignSurfaceExtension nunca deve ser implementada no mesmo objeto que a classe Package.

  2. Registrando a classe que implementa DesignSurfaceExtension como fornecendo suporte para as extensões de designer do VSPackage. Registre a classe aplicando instâncias de DesignSurfaceExtensionAttribute, ProvideObjectAttribute e ProvideServiceAttribute à classe que fornece a implementação de Package do VSPackage.

Sempre que um designer ou componente de designer é criado, o ambiente do Visual Studio:

  • Acessa cada provedor de extensão de superfície de design registrado.

  • Instancia e inicializa uma instância do objeto DesignSurfaceExtension de cada provedor de extensão de superfície de design.

  • Chama o método OnDesignerCreated ou OnComponentCreated de cada provedor de extensão de superfície de design (conforme apropriado).

Ao implementar o objeto DesignSurfaceExtension como membro de um VSPackage, é importante entender que:

  • O ambiente do Visual Studio não fornece nenhum controle sobre quais metadados ou outras definições de configuração um determinado provedor DesignSurfaceExtension modifica. É possível que dois ou mais provedores DesignSurfaceExtension modifiquem o mesmo recurso de designer de maneiras conflitantes, com a modificação final sendo definitiva. É indeterminado qual modificação é aplicada por último.

  • É possível restringir explicitamente uma implementação do objeto DesignSurfaceExtension a designers específicos aplicando instâncias de ToolboxItemFilterAttribute a essa implementação. Para obter mais informações sobre a filtragem de itens da Caixa de Ferramentas, consulte ToolboxItemFilterAttribute e ToolboxItemFilterType.

Provisionamento de metadados adicionais

Um VSPackage pode alterar a configuração de um designer ou componente de designer que não seja no tempo de design.

A classe ProvideDesignerMetadataAttribute pode ser usada programaticamente ou aplicada a um VSPackage que fornece um designer.

Uma instância da classe ProvideDesignerMetadataAttribute é usada para modificar os metadados de componentes criados em uma superfície de design. Por exemplo, pode-se substituir um navegador de propriedades padrão usado por objetos CommonDialog por um navegador de propriedades personalizado.

As modificações fornecidas por uma instância de ProvideDesignerMetadataAttribute aplicadas à implementação de Package de um VSPackage podem ter um dos dois escopos:

  • Global -- para todas as novas instâncias de um determinado componente

  • Local -- pertencente apenas à instância do componente criado em uma superfície de design fornecida pelo VSPackage atual.

A propriedade IsGlobal da instância ProvideDesignerMetadataAttribute aplicada à implementação de Package de um VSPackage determina esse escopo.

Aplicar o atributo a uma implementação de Package com a propriedade IsGlobal do objeto ProvideDesignerMetadataAttribute definida como true, conforme abaixo, altera o navegador para todo o ambiente do Visual Studio:

[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser), IsGlobal=true )]

internal class MyPackage : Package {}

Se o sinalizador global tiver sido definido como false, a alteração de metadados será local para o designer atual compatível com o VSPackage atual:

[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser), IsGlobal=false )]

internal class MyPackage : Package {}

Observação

A superfície de design só dá suporte à criação de componentes e, portanto, somente os componentes podem ter metadados locais. No exemplo acima, estávamos tentando modificar uma propriedade, como a propriedade Color de um objeto. Se false fosse passado para o sinalizador global, CustomBrowser nunca apareceria porque o designer nunca cria uma instância de Color. Definir o sinalizador global como false é útil para componentes, como controles, temporizadores e caixas de diálogo.