为什么存在作为URL的XAML名称空间?

为什么存在作为URL的XAML名称空间?,xaml,namespaces,Xaml,Namespaces,在代码顶部的Silverlight/WPF xaml中,您有名称空间/导入类型声明。我可以很容易地理解这些声明如何指向程序集,以便从中加载类型等。我不明白的是(到目前为止我还没有真正考虑过)这些名称空间在指向url时是如何工作的,例如 http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit 查看此URL会给我一个错误,因此不会告诉我任何信息。据我所知,它们只是不符合惯例的URL,任何唯一标识符都可以 如果您检查HTML

在代码顶部的Silverlight/WPF xaml中,您有名称空间/导入类型声明。我可以很容易地理解这些声明如何指向程序集,以便从中加载类型等。我不明白的是(到目前为止我还没有真正考虑过)这些名称空间在指向url时是如何工作的,例如

http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit

查看此URL会给我一个错误,因此不会告诉我任何信息。

据我所知,它们只是不符合惯例的URL,任何唯一标识符都可以

如果您检查HTML文档类型,它们与实际加载时完全相同:)例如:或

但是,这些URL上为什么没有任何内容是毫无意义的,最好有一些实际引用…

在被引用程序集的代码中,有一个Uri映射到代码命名空间:

[XmlnsDefinitionAttribute("http://yournamespace/", "Your.Assembly.Namespace")]
您可以包括这些属性中的多个,通常是在
AssemblyInfo.cs
中,允许Xaml中的单个Uri命名空间引用多个代码命名空间

这使名称空间声明更加紧凑(因为可以省略程序集名称)。它还允许您在不破坏标记的情况下,灵活地重新组织引用程序集中的名称空间

编辑:例如,如果将Reflector指向
PresentationCore
程序集,则可以在程序集级别看到如下属性:

[assembly: 
    XmlnsDefinition( "http://schemas.microsoft.com/netfx/2007/xaml/presentation"
                   , "System.Windows.Ink") ]

这就是Uri导入映射到代码名称空间的方式。

它们应该是Xml名称空间名称,应该是Uri。不过,没有要求Uri实际承载任何内容。由于xaml引用的URI实际上映射到本地代码程序集,因此您无法在那里托管任何有意义的内容。项目属性中显示的我的程序集名称是
Company.Component
,而我试图引用的程序集中的命名空间是
Company.Component.Behaviors
但是
[程序集:XmlnsDefinition(“http://Behaviors.Component.Company“,”Company.Component.Behaviors“]
在当前程序集中被xaml文件引用,仍然无法找到,因此生成中的xaml编译步骤失败。还尝试将可选的
AssemblyName=“Company.Component”
零件添加到程序集属性中(带和不带
.exe