Configurando o namespace de um WinForms UserControl em VB.NET
-
09-06-2019 - |
Pergunta
Como você define seus UserControls como estando em um namespace abaixo do namespace do projeto, ou seja.[RootNameSpace].[SubSectionOfProgram].Controles?
Editar devido à resposta do camainc: Também tenho a restrição de ter todo o código em um único projeto.
Edite para finalizar a pergunta: Como eu suspeitava, não era possível fazer o que eu precisava, então a resposta do camainc é a solução mais próxima.
Solução
Não tenho certeza se é isso que você está perguntando, mas é assim que fazemos.
Colocamos nomes em todos os nossos projetos de maneira consistente, os controles de usuário não são diferentes.Também criamos namespace usando a janela de configurações do projeto, embora você possa fazer isso por meio de uma combinação da janela do projeto e no código.
Cada solução recebe um namespace como este:
[CompanyName].[SolutionName].[ProjectName]
Portanto, nossos controles de usuário normalmente estão em um projeto chamado "Controles", que teria um namespace de:
OurCompany.ThisSolution.Controls
Se tivermos controles que podem abranger várias soluções diferentes, apenas o nomeamos da seguinte forma:
OurCompany.Common.Controls
Então, em nosso código iremos importar a biblioteca, ou adicionar o projeto à solução.
Imports OurCompany
Imports OurCompany.Common
Imports OurCompany.Common.Controls
Também nomeamos as pastas onde os projetos residem da mesma forma que o namespace, até, mas não incluindo, o nome da empresa (presume-se que todas as soluções estejam no namespace da empresa):
\Projetos
\Projetos\MinhaSolução
\Projetos\MinhaSolução\Controles
-- ou --
\Projetos\
\Projetos\Comum
\Projetos\Comuns\Assemblies
\Projetos\Common\Controles
etc.
Espero que ajude...
Outras dicas
Se não quiser que os controles estejam em um projeto separado, basta adicionar a palavra-chave Namespace ao topo do arquivo de código.Por exemplo, fiz algo assim em vários projetos:
Imports System.ComponentModel
Namespace Controls
Friend Class FloatingSearchForm
'Your code goes here...
End Class
End Namespace
Você não poderá especificar que os controles estão em um namespace raiz diferente daquele especificado para o projeto do qual fazem parte.O VB simplesmente anexará tudo o que você especificar para o namespace ao namespace especificado na janela de propriedades do projeto.Portanto, se todo o seu projeto for "AcmeCorporation.WidgetProgram" e você adicionar "Namespace Controls" ao topo de um arquivo de controle, o controle estará no namespace "AcmeCorporation.WidgetProgram.Controls".Não é possível fazer o controle aparecer no namespace "AcmeCorporation.SomeOtherProgram.Controls".
Observe também que se você estiver usando o designer para editar seus controles, será necessário adicionar a palavra-chave Namespace à classe parcial oculta criada pelo designer.Clique no botão "Mostrar todos os arquivos" no gerenciador de soluções e, em seguida, clique na seta de expansão ao lado do seu controle.Você deverá ver um arquivo "*.Designer.vb" listado.Adicione o Namespace a esse arquivo também.O designer respeitará esta modificação e seu projeto agora deverá ser compilado sem erros.Obviamente, o namespace especificado na classe parcial do designer deve ser o mesmo especificado no seu arquivo de classe!Para o exemplo acima:
Namespace Controls
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class FloatingSearchForm
'Designer generated code
End Class
End Namespace
Você quer dizer que deseja acessar os controles do usuário em tempo de execução (no código) via
[ProjectNamespace].[YourSpecialNamespace].Controls
em vez do padrão de
[ProjectNamespace].Controls
?Porque não acredito que isso seja possível.Se não me engano, o Controls
A coleção do seu projeto/aplicativo é incorporada pela estrutura - você não pode alterá-la.Você pode, como observou o camainc, usar a janela de configurações do projeto (ou código) para colocar os próprios controles em um namespace específico da seguinte maneira:
Namespace [YourSpecialNamespace]
Public Class Form1
[...]
End Class
End Namespace
Claro, pensando um pouco mais sobre isso, suponho que você poderia projetar e construir seu próprio Controls
coleção em seu namespace - talvez como um wrapper para o interno ...