在VB.NET中设置WinForms UserControl的命名空间
如何将UserControls定义为位于项目名称空间下方的名称空间中,即。 [RootNameSpace]。[SubSectionOfProgram] .Controls?
根据camainc的回答进行编辑:我也有一个约束,我必须将所有代码都放在一个项目中。
编辑以最终确定问题:由于我怀疑无法完成我所需要的工作,因此camainc的答案是最近的解决方案。
解决方案
回答
我不确定这是否是我们要的内容,但这就是我们的工作方式。
我们以一致的方式对所有项目进行命名空间,用户控件也不例外。我们也使用项目设置窗口来命名空间,尽管我们可以通过项目窗口和代码的组合来实现。
每个解决方案都有一个这样的名称空间:
[CompanyName].[SolutionName].[ProjectName]
因此,我们的用户控件通常位于名为"控件"的项目中,该项目的名称空间为:
OurCompany.ThisSolution.Controls
如果我们的控件可能跨越几种不同的解决方案,则可以像这样对它进行命名空间:
OurCompany.Common.Controls
然后,在我们的代码中,我们将导入库,或者将项目添加到解决方案中。
Imports OurCompany Imports OurCompany.Common Imports OurCompany.Common.Controls
我们还将项目所在的文件夹命名为与名称空间相同的名称,直到但不包括公司名称(所有解决方案均假定在公司名称空间中):
\项目
\ Projects \ MySolution
\ Projects \ MySolution \ Controls
-或者 -
\项目
\ Projects \ Common
\ Projects \ Common \ Assemblies
\ Projects \ Common \ Controls
等等。
希望对我们有帮助...
回答
意思是我们希望能够在运行时通过代码访问用户控件吗?
[ProjectNamespace].[YourSpecialNamespace].Controls
而不是默认
[ProjectNamespace].Controls
?因为我不相信那是可能的。如果我没记错的话,项目/应用程序的Controls
集合是由框架内置的,我们无法更改它。正如camainc指出的那样,我们可以使用项目设置窗口(或者代码)将控件本身放置在特定的命名空间中,从而:
Namespace [YourSpecialNamespace] Public Class Form1 [...] End Class End Namespace
当然,再考虑一下,我想我们可以在命名空间中设计和构建自己的Controls
集合,也许可以作为内置对象的包装器...
回答
如果我们不希望控件位于单独的项目中,则可以将Namespace关键字添加到代码文件的顶部。例如,我在几个项目中做了这样的事情:
Imports System.ComponentModel Namespace Controls Friend Class FloatingSearchForm 'Your code goes here... End Class End Namespace
我们将无法指定控件所在的根名称空间不同于为其所属项目指定的根名称空间。 VB会简单地将我们为名称空间指定的任何内容追加到在项目属性窗口中指定的名称空间。因此,如果整个项目是" AcmeCorporation.WidgetProgram",并且在控件文件的顶部添加了"命名空间控件",则该控件将位于名称空间" AcmeCorporation.WidgetProgram.Controls"中。无法使控件出现在" AcmeCorporation.SomeOtherProgram.Controls"命名空间中。
还要注意,如果使用设计器来编辑控件,则需要将Namespace关键字添加到设计器创建的隐藏的部分类中。单击解决方案资源管理器中的"显示所有文件"按钮,然后单击控件旁边的展开箭头。我们应该看到列出的" * .Designer.vb"文件。也将命名空间添加到该文件。设计人员将尊重此修改,并且项目现在应该可以正确编译。显然,在设计器局部类中指定的名称空间必须与在类文件中指定的名称空间相同!对于上面的示例:
Namespace Controls <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Partial Class FloatingSearchForm 'Designer generated code End Class End Namespace