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 os seus componentes do Windows Forms e controles:
Não é possível compilar
Não é possível depurar em tempo de Design
Erro no compilador: "O nome ou tipo namespace nome ' tipo ' não foi encontrado."
Erro de tempo de design: "Falha ao criar o componente 'nome do componente.'"
Erro de depuração: "Operação ilegal de thread cruzado: Nome do controle do controle acessado a partir de um thread diferente, por exemplo, o thread em 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 por um Behavior personalizado
Designer eventos disparados de maneira indesejada
Falham de coleções serializar
Falha de Designer adquirir uma UndoEngine referência
O 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 obter uma parte significativa do desenvolvimento de tempo de design, você deve adicionar uma referência ao assembly de 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 de pontos estratégicos no seu código.
Conecte a outra instância de Visual Studio para depurar o ambiente de design da primeira instância.
Para obter mais informações, consulte Como: Acessar os serviços de tempo de Design.
Erro no compilador: "O nome ou tipo namespace nome ' tipo ' não foi encontrado"
Você deve referenciar o assembly System.Design. Tipos de Designer estão localizados no assembly System.Design. Isso inclui os 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 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 quando você está criando o seu componente ou controle na superfície de design a partir de Toolbox. A tabela a seguir mostra as duas causas prováveis desse erro.
Causa |
Descrição |
Anotações |
---|---|---|
Construtor de 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 |
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á-lo do 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 o qual Type. 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: "O valor não pode ser nulo.Nome do parâmetro: 'nome do componente "
Você pode receber esse erro quando você está criando o seu componente ou controle na superfície de design a partir de Toolbox. A causa mais provável é que você está tentando usar um componente ou controle foi criado para um assembly de 64 bits. O ambiente de design de Visual Studio não oferece suporte a componentes de 64 bits.
Erro de depuração: "Operação ilegal de thread cruzado: Nome do controle do controle acessado a partir de um thread diferente, por exemplo, o thread em que foi criado ".
Se você usar multithreading em seus aplicativos de Windows Forms, você deve ter cuidado ao fazer chamadas para seus controles de 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 você vê-lo. Para obter mais informações, consulte Como: Fazer chamadas de 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 um que você pode criar. A primeira classe no arquivo deve implementar a IComponent interface ou ela deve derivar da Component classe ou uma classe que deriva Component.
Glifos permanecem depois que o componente é excluído.
Se o 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, desmarque Glyph objetos e relacionadas Adorner e Behavior objetos. Para obter mais informações, consulte Como: Estender a aparência e o comportamento dos controles no modo de Design.
Comportamento de Designer padrão obscurecido por um 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 limites do mesmos como o glifo do corpo, irá obscurecer base Behavior implementação associados 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 a base de objetos, para que você não pode lidar com uma mensagem de mouse e encaminhá-lo a qualquer 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 disparados de maneira indesejada
Se o seu designer personalizado anexa manipuladores de eventos para eventos de designer, como ComponentRemoved ActiveDesignerChanged, 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: "Referência de objeto não definida para uma instância de um objeto."
Manipuladores de eventos chamado inadequadamente quando os 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 para ser serializado, aplicar 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 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 chamadas subseqüentes para GetService retornará um UndoEngine de referência.
Em geral, você raramente deve exigir uma referência para o UndoEngine diretamente. Nesses 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.
O 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 as propriedades diretamente. Para eventos como ComponentChanged para ser gerado, você deve definir o valor de propriedades do 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 o comportamento dos controles no modo de Design.
Sintaxe de DesignerAttribute
Anexar o seu designer personalizado para o controle que ele projeta aplicando o 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ê altera os aspectos de tempo de design de um componente, 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 em C#.
private System.ComponentModel.IContainer components = null;
Dependendo de quais regras FxCop estão em vigor, o FxCop pode produzir "donotinitializeunnecessarily" aviso. Isso ocorre porque null é o padrão do Common Language Runtime (CLR) para referência de propriedades.
Se o designer não inicializou a components campo para null, o compilador C# produziria o seguinte aviso:
"Form1.components nunca é atribuído a 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 em um arquivo dedicado, separado do arquivo principal do componente. Por exemplo, em um projeto de aplicativo do Windows Forms, a definição para o Form1 classe é dividido em dois arquivos, como 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 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 de designer sendo intercaladas com seu código. Para obter mais informações sobre o partial palavra-chave, consulte Parcial Classes e métodos (guia de programação TRANSLATION FROM VPE FOR CSHARP) e Partial (Visual Basic).
O Windows Forms Designer não oferece suporte, dividindo a definição do tipo de 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 será visíveis no Windows Forms Designer.
Controles de personalizados herdados causam um comportamento inesperado no Designer
Quando os tipos são invalidados no designer, o ComponentSerializationService realiza uma Recarregar parcial para atualizar o designer com os tipos atualizados. Versões do Visual Studio anterior Visual Studio 2005 completamente recarregado 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 correspondentes serializadores criados antes de Visual Studio 2005 pode não ser capaz de acomodar uma recarga parcial. Componentes e controles podem causar um comportamento inesperado porque 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 existem controles herdados.
Você pode reverter para o comportamento de recarregamento completo, adicionando a seguinte configuração no arquivo devenv.exe.config. Se você instalou Visual Studio 2005 para o local padrão, este arquivo está na pasta \ Common7\IDE do C:\Program Files\Microsoft Visual Studio.
<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 designer e implementar a Styles propriedade. No IDictionary expostos por Styles, atribuir um novo Font como o elemento especificado por "dialogfont" chave, como mostrado no fragmento de código a seguir.
Styles["DialogFont"] = new Font(...);
Ícone do componente não aparecerá na caixa de ferramentas
Em Visual Studio, quando você usa ToolboxBitmapAttribute para associar um ícone com o componente personalizado, o bitmap não aparece na caixa de ferramentas para todos os 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 de caixa de ferramentas.
Consulte também
Tarefas
Como: Acessar os serviços de tempo de Design
Conceitos
Erros de tempo de design no Designer de formulários do Windows