在XAML中导入命名空间时会发生什么?

时间:2017-12-06 01:17:41

标签: .net wpf xaml namespaces xml-namespaces

我有一个我在WPF工作的软件项目,其他几个" Helper"程序集,结构如下:

  • 控件(WPF自定义控件库)
  • 图书馆(C#班级图书馆)
  • 主要项目(WPF申请)

在" Controls"汇编,我有几个名称空间将相关类型的控件组合在一起。这使得管理哪个代码在此程序集中的位置变得容易,因为名称空间与文件夹名称相同。

但是,当我在项目的其他部分使用这些控件时,这会让人感到有些困惑,特别是因为我有时必须在同一个文件中使用多个命名空间声明来引用" Controls&的不同部分#34;部件。

我一直想知道将所有控件放到一个我可以在任何地方使用的更集中的命名空间是否更有意义。这样做的障碍是,每次我使用该命名空间时,它都会引用程序集中的所有控件。但是,它会使我的XAML更清洁。

那么,当我在XAML中导入命名空间引用时实际发生了什么?它的工作方式与C#相同吗?如果我有一堆未使用的参考文件,会发生什么?如果我将所有控件放在同一个命名空间中,从性能角度来看是否可以?

或者,我只是愚蠢而且完全问错了问题?

1 个答案:

答案 0 :(得分:1)

  

我一直想知道将所有控件放到一个我可以在任何地方使用的更集中的命名空间是否更有意义。

确实没有必要这样做。

  

阻止这样做的障碍是,每次我使用该命名空间时,它都会引用程序集中的所有控件。 [...]那么,当我在XAML中导入命名空间引用时实际发生了什么? [...]如果我有一堆未使用的参考文件,会发生什么?

没什么重要的。 XAML名称空间只是在编译时解析对象引用的机制。编译器最终会忽略任何未使用的引用。它对性能没有影响。

  

如果我将所有控件放在同一个命名空间中,从性能角度来看是否可以?

性能不会受到任何影响,但我建议您保留现有文件&文件夹结构。

您可以使用XmlnsDefinitionAttribute将来自不同C#名称空间的控件放入相同的逻辑 XAML名称空间。此属性放在 AssemblyInfo.cs 文件中,如下所示:

[assembly: XmlnsDefinition("http://mycompany.com/controls", "MyCompany.Controls.Core")]
[assembly: XmlnsDefinition("http://mycompany.com/controls", "MyCompany.Controls.Primitives")]

在引用程序集的程序集中,您可以执行以下操作:

...
xmlns:mycontrols="http://mycompany.com/controls"
...
<mycontrols:Foo ... />
<mycontrols:Bar ... />

因此Foo控件可以存在于C#名称空间MyCompany.Controls.Core中,Bar控件可以存在于C#名称空间MyCompany.Controls.Primitives中,但两者都可以使用相同的引用XAML命名空间(http://mycompany.com/controls,此处使用mycontrols前缀别名)。