Desenvolvimento de time de design de solução de problemas
Os seguintes problemas comuns podem ocorrer quando você criar uma experiência de time de design personalizada para seus componentes Windows Forms e controles:
Não é possível depurar em time de design
Erro do compilador: "O nome do namespace ou tipo nome ' tipo ' não foi encontrado."
Erro de time de design: "Falha ao criar o componente 'nome do componente.'"
Erro de depuração: "Operação entre threads inválida: Controle 'controle de nome' acessado de um thread diferente do thread em que foi criado ".
Erro de time de design: "Não é possível em em aberto um designer para o arquivo porque a classe nele não herda de uma classe que pode ser criada visualmente."
Glifos permanecem após o componente é excluída
Comportamento de designer padrão obscurecido por um Behavior personalizado
Designer eventos gerados em um modo indesejado
Coleções falham ao serializar
Designer Falha ao adquirir um UndoEngine Referência
Ambiente de design não reconhece alterações para propriedades do componente
DesignerAttribute Sintaxe
Atualizando o ambiente de design após fazer alterações no componente ou o Designer
Aviso do FxCop em formulário do Windows recém-gerado: DoNotInitializeUnnecessarily
Classes parcial e o Designer de Formulários do Windows
Controles personalizados herdado causam comportamento inesperado no Designer
Marca SMART em um designer hospedado gerará uma exceção
Ícone do componente não aparece na caixa de ferramentas
Não é possível depurar em time de design
Há duas maneiras para depurar seu Design-código de time:
Coloque 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: Serviços de time de design de acesso.
Erro do compilador: "O nome do namespace ou tipo nome ' tipo ' não pode ser encontrado"
Você deve fazer referência sistema.design do assembly.Tipos de Designer estão localizados em sistema.design do assembly.Isso inclui tipos no System.Windows.Forms.Design e System.ComponentModel.Design espaços para nome.
Além disso, certifique-se de importar os namespaces que necessária usando o Imports ou using palavras-chave. Para obter mais informações, consulte Como: Suporte ao time de design de acesso no Windows Forms.
Erro de time de design: "Falha ao criar o componente 'nome do componente'"
Você pode receber essa mensagem de erro ao criar seu componente ou controle na área de design do Caixa de ferramentas.A tabela a seguir mostra as duas causas prováveis para esse erro.
Causa |
Descrição |
Anotações |
---|---|---|
Construtor padrão ausente |
O 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 |
O componente ou controle não pode ser um genérico tipo, que também é chamado de um modelo type or a parametrizados tipo.O ambiente de design não oferece suporte a tipos genéricos. |
Se o tipo genérico deriva de UserControl e você tentar executá-lo no Visual Studio Contêiner de teste de UserControl, você receberá o seguinte erro: Falha ao criar UserControl ' nome ' Embora os seus componentes e controles não podem ser tipos genéricos, eles podem usar tipos genéricos. |
Erro de time de design: "O valor não pode ser nulo.Nome do parâmetro: "nome do componente'"
Você pode receber essa mensagem de erro ao criar seu componente ou controle na área de design 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 bit.Ambiente de design do Visual Studio não oferece suporte a componentes de 64 bit.
Erro de depuração: "Operação entre threads inválida: Controle 'controle de nome' acessado de um thread diferente do thread em que foi criado ".
Se você usar multithreading em seus aplicativos de Windows Forms, você deve ter cuidado para fazer chamadas para os controles de forma segura para thread.Essa exceção é gerada pelo depurador e não aparece em time de execução, mas é altamente recomendável para corrigir esse problema quando a vê.Para obter mais informações, consulte Como: Fazer chamadas de thread-safe para controles Windows Forms.
Erro de time de design: "Não é possível em em aberto um designer para o arquivo porque a classe 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 um que você pode criar.A primeira classe no arquivo deve implementar o IComponent interface, ou deve derivar da Component classe ou uma classe que deriva Component.
Glifos permanecem após o componente é excluída
Se seu designer personalizado cria qualquer Adorner objetos, você deve excluí-los da área de design quando seu designer fica fora do escopo. De telefonarBehaviorServiceAdornerCollection.Remove no seu designer Dispose método para desmarcar Glyph objetos e relacionadas Adorner e Behavior objetos. Para obter mais informações, consulte Como: Estender a aparência e comportamento de controles em modo de design.
Comportamento de designer padrão obscurecido por um Behavior personalizado
O designer de controle padrão cria um glifo que abrange todo o controle na área de design.Isso é denominado o glifo de corpo.Se seu designer personalizado controle cria um glifo com sistema autônomo limites mesmos sistema autônomo o glifo do corpo, ele irá obscurecer o subjacente Behavior implementação associada com o glifo do corpo. Isso impede que sistema autônomo recursos padrão, sistema autônomo Rótulos inteligentes e redimensione glifos apareça.
Não é possível passar mensagens entre Behavior objetos, para que você não pode manipular uma mensagem de 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.
Designer eventos gerados em um modo indesejado
If your custom designer attaches event handlers to designer events such as ComponentRemovedActiveDesignerChanged, and SelectionChanged, you must detach your event handlers in your designer's Dispose method.
Falha ao fazer isso pode resultar em comportamento não intencional no time 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: "Referência de objeto não conjunto a uma instância de um objeto."
Manipuladores de eventos chamado inadequadamente quando componentes são excluídos ou designers são fechados.
Coleções falham ao serializar
Se você desejar que o componente personalizado ou propriedade de coleção do controle para ser serializado, aplique o DesignerSerializationVisibilityAttribute e defina-o para Content. Para obter mais informações, consulte Como: Serializar coleções de tipos padrão com o DesignerSerializationVisibilityAttribute.
Falha no Designer obter uma referência UndoEngine
Se você tentar adquirir uma referência à UndoEngine serviço enquanto um formulário é carregado, o GetService método retorna null.
The UndoEngine serviço não é criado e ativado até que o formulário tenha completado sua fase de carregamento. Depois que o formulário é carregadas chamadas subseqüentes para GetService retornará um UndoEngine referência.
Em geral, você deve exigir uma referência para o raramenteUndoEngine diretamente. Nos casos em que ele for necessário geralmente são causados por uma ação do usuário e ocorrem depois que o designer está carregado.
Ambiente de design não reconhece alterações para propriedades do componente
O ambiente de design não reconhece as alterações do componente ou controle se você conjunto propriedades diretamente.Para eventos como ComponentChanged para ser gerado, você deve conjunto o valor das propriedades do seu componente com o PropertyDescriptor.SetValue método. Isso notifica o ambiente de desenvolvimento da alterar de propriedade, permitindo que a área de design e PropertyGrid controles para atualizar corretamente. Para obter mais informações, consulte Como: Estender a aparência e comportamento de controles em modo de design.
Sintaxe DesignerAttribute
Você conectar seu designer personalizado controle que ele projeta, aplicando o DesignerAttribute para o controle.
Você deve especificar com precisão o DesignerAttribute parâmetros, caso contrário, o ambiente de design não carregará seu designer personalizado.
Atualizando o ambiente de design após fazer alterações no componente ou o Designer
Quando você faz alterações aos aspectos de um componente de time de design, você deve recompilar o projeto do componente.Além disso, se houver outro projeto Windows Forms que está em 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 do FxCop em formulário do Windows recém-gerado: DoNotInitializeUnnecessarily
O Designer de Formulários do Windows gera o seguinte código para projetos de aplicativo do Windows Forms no translation from VPE for Csharp.
private System.ComponentModel.IContainer components = null;
Dependendo do que as regras FxCop estão em vigor, o FxCop pode produzir o aviso "DoNotInitializeUnnecessarily".Isso ocorre porque o null é o padrão do CLR (Common linguagem tempo de execução) para fazer referência a propriedades.
Se o designer não inicializou a components campo para null, o compilador translation from VPE for Csharp produziria o seguinte aviso:
"Form1.components nunca é atribuído e sempre terá seu valor padrão nulo."
Você pode suprimir o aviso de FxCop com SuppressMessageAttribute, mas isso pode causar problemas de manutenção se o nome de classe for alterado. Portanto, é recomendável que você ignorar o aviso de FxCop.
Classes parcial e o Designer de Formulários do Windows
Por padrão, o Designer de Formulários do Windows emite código do designer de serialização em um arquivo dedicado é separado do arquivo principal do seu componente.For example, em um projeto Windows Forms aplicativo, a definição para o Form1 classe é dividido em dois arquivos, sistema autônomo mostrado na tabela seguinte.
Arquivo (nomes de arquivo translation from VPE for Csharp) |
Função |
---|---|
Form1.cs |
Arquivo de classe principal |
Form1.Designer.cs |
Código emitido Designer |
Arquivo (nomes de arquivo VB) |
Função |
---|---|
Form1.vb |
Arquivo de classe principal |
Form1.Designer.vb |
Código emitido Designer |
Em geral, não é necessário modificar o código emitido por Designer de Formulários do Windows.Edite o arquivo de classe principal.
O Designer de Formulários do Windows usa o partial palavra-chave para dividir a implementação de Form1 em dois arquivos separados. Isso impede que o código emitido designer sendo intercalados com o seu código.Para obter mais informações sobre o partial palavra-chave, consulte Parcial classes e métodos (Guia de programação C#) e Partial (Visual Basic).
O Designer de Formulários do Windows não oferece suporte a divisão de definição do tipo projetáveis em mais de dois partial implementações. Essa restrição inclui a criação de um novo arquivo de classe que contém uma terceira definição parcial do tipo, bem sistema autônomo adicionar uma terceira definição de classe parcial do tipo no arquivo principal ou no arquivo designer.Membros definidos dessa forma não será visíveis no Designer de Formulários do Windows.
Controles personalizados herdado causam comportamento inesperado no Designer
Quando são invalidados tipos no designer, o ComponentSerializationService executa um parcial recarregar para atualizar o criador com tipos atualizados.Versões de Visual Studio anterior Visual Studio 2005 recarregadas completamente o designer. O parcial recarregar comportamento em Visual Studio 2005 é mais rápido do que uma recarga completa e ele também preserva a pilha de desfazer.
Componentes e correspondentes serializadores criados antes de Visual Studio 2005 não poderá acomodar um parcial recarregar. 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 Designer de Formulários do Windows quando existem controles herdado.
Você pode reverter para o comportamento de recarregar completo, adicionando a seguinte configuração ao arquivo devenv.exe.config.Se você instalou o Visual Studio 2005 para o localização padrão, este arquivo está na pasta c:\Arquivos de Programas\Microsoft Visual Studio n:\programa.
<appSettings>
<add key="EnableOptimizedDesignerReloading" value="false" />
</appSettings>
Marca SMART em um designer hospedado gerará uma exceção
Se você estiver hospedando um designer fora Visual Studio, suas Rótulos inteligentes podem elevar uma NullReferenceException. Para resolver esse problema, forneça um IUIService referência no designer e implementar o Styles propriedade. No IDictionary expostos pelo Styles, atribua um novo Fontsistema autônomo o elemento especificado pela chave "DialogFont", conforme mostrado no fragmento de código a seguir.
Styles["DialogFont"] = new Font(...);
Ícone do componente não aparece na caixa de ferramentas
In Visual Studio, quando você usa ToolboxBitmapAttribute para associar um ícone do componente personalizado, o bitmap não aparece na caixa de ferramentas para componentes gerados automaticamente. Para ver o bitmap, recarregar o controle usando o Escolher itens da caixa de ferramentas caixa de diálogo.
Consulte também
Tarefas
Como: Serviços de time de design de acesso
Conceitos
Erros de tempo de design no Windows Forms Designer