Qual é o estado de jogar com o "Visual Herança"
-
09-06-2019 - |
Pergunta
Temos um aplicativo que tem de ser flexível na forma como ele exibe o formulário principal para o usuário, dependendo do usuário, o formulário deve ser um pouco diferente, talvez um extra botão aqui ou ali, ou alguma outra nuance.A fim de parar de escrever o código para remover explicitamente ou adicionar controles, etc, eu virei para o visual herança para resolver o problema, o que eu achava que era um puro, limpo e lógica OO estilo - acontece que a metade do tempo formulários herdados ter um tempo difícil de renderização themeselves no VS por nenhuma boa razão, etc. - e eu tenho a sensação de que os desenvolvedores e, em certa medida Microsoft tem evitado a prática do Visual Herança - você pode confirmar isso, eu estou faltando alguma coisa aqui?
Cumprimentos.
Solução
Eu pensei que eles tinham mais ou menos ordenada a área de trabalho do designer de problemas, em 2005.Você já tentou o de costume, culpados?
- Não há resumo de controle de tipos de
- Nenhum construtor de argumentos em qualquer formulário
- Inicialização mudou-se para Form_Load como oposição ao Construtor
- Sem controles no mesmo projeto como o usercontrol/formulário que eles são colocados dentro
- Feche todos os documentos -> Limpa -> Renovação
- Reinicie VS
Eu parecia pensar que enquanto você fez todas as opções acima funcionou.....principalmente.
Outras dicas
Eu estou estudando para o (reconhecidamente logo-a-ser-obsoleta) MCAD, e parte do WinForms elemento Visual Herança.
Eu, pessoalmente, não tinha grandes problemas com ele, no entanto, não são considerações para levar em conta.
Para mim, o principal problema tem sempre a inicialização..Você precisa lembrar-se de que o designer não pode/não instanciar formas da mesma forma que o faz em tempo de execução (da mesma forma, é possível fazer isso com o web dev, que é por isso que é preciso ter cuidado com o controle personalizado de renderização).
Também, uma vez que um formulário é alterado, uma completa re-compilação do projeto é necessária a fim de propagar as alterações para o formulário para a criança, de formas que herdam dele.
Eu, pessoalmente, tenho visto nenhuma evidência para sugerir que ele foi "desprezada". AFAIK, ainda é uma boa prática para exercer o código de re-utilização, sempre que possível.O Visual herança que fornece.
Gostaria de sugerir a criação de uma nova causa, com o real problemas que você está tendo, com o código de exemplo?Podemos, então, olhar para ele para ver se podemos fazê-lo funcionar e explicar o porquê :)
Eu vi alguns problemas no VS2005 com isso.Eles eram, em sua maioria devido a problemas com a construção das formas-objetos no designer.Houve problemas com o código que tentou acessar o banco de dados a partir do formulário de construtores, etc.
Você pode depurar problemas como este, ao iniciar uma segunda instância do visual studio e do carregamento de primeira instância do depurador.Se você definir pontos de interrupção no código você pode, em seguida, depurar o que acontece no estilistas em primeira instância.
Outro problema que eu lembro foi genéricos em classes de formulário
public class MyForm<MyObject> : Form
isso não vai funcionar
Muitas vezes eu tropeçar em cima de tais problemas no Visual Studio.Em muitos casos MSVS forms designer não é processado de forma correta.Na época eu trabalhava com WinForms que eu tinha para fazer todo o tipo de estranho truques para habilitar alguns cenários complexos.No entanto, eu acho que o uso de herança visual é muito benéfico e não deve ser jogado fora, independentemente de MSVS designer de bugs.
Eu acho que eu encontrei uma maneira de evitar esse problema.
Não gancho de Evento Form_Load em seu formulário pai, isso irá quebrar o designer.
Também não tome o Padrão construtor vazio longe do Visual Studio no Formulário Pai.Se você quer ter a Injeção de Dependência, criar outro construtor.
Como esta:
public ProductDetail()
{
InitializeComponent();
}
public ProductDetail(ISupplierController supplierController) : base()
{
InitializeComponent();
this.supplierController = supplierController;
}
Em seguida, você pode ainda fazer isso a partir do seu Formulário herdado:
public NewProduct(ISupplierController supplierController)
: base(supplierController)
{
InitializeComponent();
}
Isso funcionou para mim até agora, e eu tinha algum estranho problemas de designer também.
um abraço Daniel
Leia isso: http://cs.rthand.com/blogs/blog_with_righthand/archive/2005/11/10/186.aspx
AFAIK, ainda há problemas com o Visual Herança e objetos que dependem de coleções para os elementos de design, normalmente controles de grade etc.Eu acredito que a MS ainda tem removido a possibilidade de mudança de f.ex.um GridView em um formulário herdado/usercontrol etc.Mas outros controles, como a caixa de Texto, Forma, UserControl, Painel etc.deve funcionar como esperado.
Eu até agora não tive nenhum problema com o VI usando 3ª parte controles de grade-me, mas você tem que ter cuidado, em particular, a remoção de itens de coleções DEVE ser evitado.