Compartilhar via


Desenvolvimento de tempo de Design de solução de problemas

Os seguintes problemas comuns podem ocorrer quando você cria uma experiência de tempo de design personalizada para seus componentes Windows Forms e controles:

  • Não é possível compilar

  • Não é possível depurar em tempo de Design

  • Erro no compilador: "O namespace ou tipo nome 'nome do tipo' não foi encontrado."

  • Erro de tempo de design: "Falha ao criar o componente '' nome do componente."

  • Depuração de erro: "operação ilegal de thread cruzado: controle 'nome do controle' acessado a partir de um segmento diferente, por exemplo, o segmento que foi criado."

  • Erro de tempo de design: "não é possível abrir um designer para o arquivo porque a classe existente nele não herda de uma classe que pode ser criada visualmente".

  • Glifos permanecem depois que o componente é excluído.

  • Comportamento de Designer padrão obscurecido pela Behavior personalizado

  • Eventos de Designer gerados de maneira não intencional

  • Falham de coleções serializar

  • Falha de Designer adquirir uma UndoEngine referência

  • Ambiente de design não reconhece as alterações nas propriedades do componente

  • DesignerAttributeSintaxe

  • Atualizando o ambiente de Design depois de fazer alterações para o componente ou o Designer

  • Aviso de FxCop em recém-gerado Windows Form: DoNotInitializeUnnecessarily

  • Classes parciais e o Windows Forms Designer

  • Controles de personalizados herdados causam um comportamento inesperado no Designer

  • A marca inteligente em um designer hospedado gerará uma exceção

  • Ícone do componente não aparecerá na caixa de ferramentas

Não é possível compilar

Para uma parte significativa do desenvolvimento de tempo de design, você deve adicionar uma referência ao assembly em tempo de design, System.Design.dll.Este assembly não está incluído na.NET Framework 4 o perfil do cliente.Para adicionar uma referência a System.Design.dll, você deve alterar a estrutura do projeto de destino para .NET Framework 4.

Não é possível depurar em tempo de Design

Há duas maneiras para depurar seu código de tempo de design:

  • Local MessageBox.Show chamadas em pontos estratégicos no seu código.

  • Conecte a outra instância do Visual Studio para depurar o ambiente de design da primeira instância.

Para obter mais informações, consulte Como: acessar serviços de tempo de Design.

Erro no compilador: "O namespace ou tipo nome 'nome do tipo' não foi encontrado"

Você deve referenciar o assembly System.Design.Tipos de Designer estão localizados no assembly System.Design.Isso inclui tipos de System.Windows.Forms.Design e System.ComponentModel.Design namespaces.

Além disso, certifique-se de importar os namespaces que você precisa usar o Imports ou using as palavras-chave.Para obter mais informações, consulte Como: suporte de tempo de Design de acesso no Windows Forms.

Erro de tempo de design: "Falha ao criar o componente 'nome do componente'"

Você pode receber esse erro ao criar seu componente ou controle na superfície de design a partir do caixa de ferramentas.A tabela a seguir mostra as duas causas prováveis desse erro.

Causa

Descrição

Anotações

Construtor de padrão ausente

Seu componente ou controle deve ter um construtor padrão, que é um construtor sem parâmetros.

O ambiente de design requer um construtor padrão para poder criar uma instância do seu tipo.

Componente é um tipo genérico

Seu componente ou controle não pode ser um genérico tipo, que também é chamado de um modelo tipo ou um parametrizadas tipo.O ambiente de design não oferece suporte a tipos genéricos.

Se o seu tipo genérico deriva de UserControl e você tentar executá-la no Visual Studio Contêiner de teste de UserControl, você receberá o seguinte erro:

Falha ao criar UserControl ' nome do'

Mensagem de erro: 'Não é possível criar um tipo para os quais ContainsGenericParameters é true'.

O UserControl será removido da lista.

Embora seus componentes e controles não podem ser tipos genéricos, eles podem usar tipos genéricos.

Erro de tempo de design: "valor não pode ser nulo.O nome do parâmetro: nome do componente "

Você pode receber esse erro ao criar seu componente ou controle na superfície de design a partir do caixa de ferramentas.A causa mais provável é que você está tentando usar um componente ou controle que foi criado para um assembly de 64 bits.O ambiente de design de Visual Studio não oferece suporte para componentes de 64 bits.

Depuração de erro: "operação ilegal de thread cruzado: controle 'nome do controle' acessado a partir de um segmento diferente, por exemplo, o segmento que foi criado."

Se você usar multithreading em seus aplicativos Windows Forms, você deve ter cuidado para fazer chamadas para seus controles em uma forma thread-safe.Essa exceção é disparada pelo depurador e não aparece em tempo de execução, mas é altamente recomendável para corrigir esse problema, quando a vê.Para obter mais informações, consulte Como: fazer chamadas do Thread-Safe para controles Windows Forms.

Erro de tempo de design: "não é possível abrir um designer para o arquivo porque a classe existente nele não herda de uma classe que pode ser criada visualmente"

O arquivo com seu componente ou controle pode conter várias definições de classe, mas a primeira classe no arquivo deve ser aquele que você pode criar.A primeira classe no arquivo deve implementar a IComponent interface, ou ele deve derivar da Component classe ou uma classe derivada Component.

Glifos permanecem depois que o componente é excluído.

Se seu designer personalizado cria qualquer Adorner objetos, você deverá excluí-los da superfície de design quando seu designer sai do escopo.Chame BehaviorServiceAdornerCollection.Remove no seu designer Dispose método para limpar, Glyph objetos e relacionadas Adorner e Behavior objetos.Para obter mais informações, consulte Como: estender a aparência e comportamento dos controles no modo de Design.

Comportamento de Designer padrão obscurecido pela Behavior personalizado

O designer de controle do padrão cria um glifo que abrange todo o controle na superfície de design.Isso é chamado de o glifo de corpo.Se o designer de controle personalizado cria um glifo com os mesmos limites como o glifo do corpo, ele escurecimento base Behavior implementação associada com o glifo do corpo.Isso impede que os recursos padrão como, por exemplo, as marcas inteligentes e redimensionar os glifos apareça.

Você não pode passar mensagens entre Behavior objetos, para que você não pode lidar com uma mensagem do mouse e encaminhá-lo para qualquer subjacente Behavior objetos.Quando você implementa um glifo que abrange todo o controle, você é responsável pela aparência inteira e o comportamento de sua experiência de design personalizado.

Eventos de Designer gerados de maneira não intencional

Se seu designer personalizado anexa manipuladores de eventos para eventos de designer, como ComponentRemovedActiveDesignerChanged, e SelectionChanged, você deve desconectar seus manipuladores de eventos no seu designer Dispose método.

Falha ao fazer isso pode resultar em comportamento indesejado em tempo de design.A lista a seguir mostra alguns dos sintomas que podem ocorrer:

  • Caixa de mensagem de erro: "Ocorreu um erro ao processar esse comando."

  • Caixa de mensagem de erro: "Object reference not set to uma instância de um objeto".

  • Manipuladores de eventos chamado inadequadamente quando componentes são excluídos ou designers são fechados.

Falham de coleções serializar

Se desejar que o componente personalizado ou uma propriedade de coleção do controle a ser serializado, aplicar o DesignerSerializationVisibilityAttribute e defina-o como Content.Para obter mais informações, consulte Como: serializar coleções de tipos padrão com o DesignerSerializationVisibilityAttribute.

Falha de Designer adquirir uma referência de UndoEngine

Se você tentar adquirir uma referência para o UndoEngine de serviço enquanto um formulário é carregado, o GetService método retorna null.

O UndoEngine service não é criado e ativado até que o formulário tenha completado sua fase de carregamento.Depois que o formulário é carregadas, subseqüentes chamadas para GetService retornará um UndoEngine referência.

Em geral, você deve exigir raramente uma referência para o UndoEngine diretamente.Nos casos em que ele for necessário geralmente são causados por uma ação do usuário e ocorrerem depois que o designer está carregado.

Ambiente de design não reconhece as alterações nas propriedades do componente

O ambiente de design não reconhece as alterações em seu componente ou controle se você definir propriedades diretamente.Para eventos como ComponentChanged a crescer, você deve definir o valor das propriedades do seu componente com o PropertyDescriptor.SetValue método.Isso notifica o ambiente de design da alteração de propriedade, permitindo que a superfície de design e PropertyGrid controles para atualizar corretamente.Para obter mais informações, consulte Como: estender a aparência e comportamento dos controles no modo de Design.

Sintaxe de DesignerAttribute

Anexar o seu designer personalizado para o controle que ele projeta, aplicando a DesignerAttribute para o controle.

Você deve especificar com precisão a DesignerAttribute parâmetros, caso contrário, o ambiente de design não carregará seu designer personalizado.

Atualizando o ambiente de Design depois de fazer alterações para o componente ou o Designer

Quando você faz alterações aos aspectos de um componente de tempo de design, você deve reconstruir o projeto do componente.Além disso, se houver outro projeto Windows Forms que está aberto e usa esse componente, você provavelmente precisará atualizar o projeto para ver as alterações.Normalmente, você deve fechar e reabrir a janela de design que contém o componente.

Aviso de FxCop em recém-gerado Windows Form: DoNotInitializeUnnecessarily

O Windows Forms Designer gera o código a seguir para projetos de aplicativo do Windows Forms no C#.

private System.ComponentModel.IContainer components = null;

Dependendo de qual regras FxCop são na verdade, o FxCop pode produzir o aviso de "DoNotInitializeUnnecessarily".Isso ocorre porque null é o padrão de Common Language Runtime (CLR) para fazer referência a propriedades.

Se o designer não inicializou a components campo para null, o compilador C# produziria o seguinte aviso:

"Form1.components nunca é atribuído e sempre terá o valor padrão nulo.

Você pode suprimir o aviso de FxCop com SuppressMessageAttribute, mas isso pode causar problemas de manutenção, se o nome da classe é alterado.Portanto, é recomendável que você ignore o aviso de FxCop.

Classes parciais e o Windows Forms Designer

Por padrão, o Windows Forms Designer emite o código do designer de serialização para um arquivo dedicado que é separado do arquivo principal do seu componente.Por exemplo, em um projeto de aplicativo do Windows Forms, a definição para o Form1 classe é dividido em dois arquivos, conforme mostrado na tabela a seguir.

Arquivo (C# nomes de arquivo)

Função

Form1. cs

Arquivo de classe principal

Form1

Código emitido de Designer

Arquivo (nomes de arquivo do VB)

Função

Form1. vb

Arquivo de classe principal

Form1.Designer.vb

Código emitido de Designer

Em geral, você não precisará modificar o código emitido pelo Windows Forms Designer.Edite o arquivo de classe principal.

O Windows Forms Designer usa o partial palavra-chave para dividir a implementação de Form1 em dois arquivos separados.Isso impede que o código emitido de designer sendo Intercalado com seu código.Para obter mais informações sobre o partial palavra-chave, consulte Parcial Classes e métodos (guia de programação do C#) e Parcial (Visual Basic).

O Windows Forms Designer não oferece suporte para a divisão de definição do tipo um projetáveis em mais de dois partial implementações.Essa restrição inclui criando um novo arquivo de classe que contém uma terceira definição parcial do tipo, bem como a adição de uma terceira definição de classe parcial do tipo no arquivo principal ou no arquivo de designer.Membros definidos dessa forma não ficará visíveis no Windows Forms Designer.

Controles de personalizados herdados causam um comportamento inesperado no Designer

Quando tipos são invalidados no designer, o ComponentSerializationService realiza uma recarga parcial para atualizar o designer com os tipos atualizados.Versões do Visual Studio anterior Visual Studio 2005 completamente recarregado o designer.A parcial recarregar o comportamento em Visual Studio 2005 é mais rápido do que uma recarga completa e ele também preserva a pilha de desfazer.

Componentes e serializadores correspondentes criados antes de Visual Studio 2005 pode não ser capazes de acomodar uma recarga parcial.Componentes e controles podem causar um comportamento inesperado porque eles foram criados para desserializar somente durante uma recarga completa.Sintomas incluem estouros de pilha, congela ou regiões em branco no Windows Forms Designer quando controles legados estão presentes.

Você pode reverter para o comportamento de recarregamento completo, adicionando a seguinte configuração no arquivo devenv.exe.config.Se você instalou o Visual Studio 2005 para o local padrão, este arquivo está na pasta Visual Studio do C:\Program Files\Microsoft Common7\IDE.

<appSettings>
   <add key="EnableOptimizedDesignerReloading" value="false" />
</appSettings>

A marca inteligente em um designer hospedado gerará uma exceção

Se você estiver hospedando um designer fora Visual Studio, suas marcas inteligentes podem elevar uma NullReferenceException.Para resolver esse problema, forneça um IUIService referência no seu designer e implementar a Styles propriedade.No IDictionary expostos por Styles, atribuir um novo Font como o elemento especificado pela chave "DialogFont", conforme mostrado no fragmento de código a seguir.

Styles["DialogFont"] = new Font(...);

Ícone do componente não aparecerá na caixa de ferramentas

Na Visual Studio, quando você usa ToolboxBitmapAttribute para associar um ícone de seu componente personalizado, o bitmap não aparece na caixa de ferramentas para componentes gerados automaticamente.Para ver o bitmap, recarregar o controle usando o Choose Toolbox Items caixa de diálogo.Para obter mais informações, consulte Ícones da caixa de ferramentas.

Consulte também

Tarefas

Como: acessar serviços de tempo de Design

Conceitos

Erros de tempo de design no Windows Forms Designer

Outros recursos

Estendendo suporte em tempo de Design