【问题标题】:Why are there XAML namespaces that are URLS?为什么会有作为 URL 的 XAML 命名空间?
【发布时间】:2016-08-05 08:43:12
【问题描述】:

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

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

查看此 URL 给我一个错误,所以没有告诉我任何信息。

【问题讨论】:

    标签: xaml namespaces


    【解决方案1】:

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

    如果您检查 HTML 文档类型,它们完全一样,因为没有实际加载 :) 例如:http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtdhttp://www.w3.org/TR/html4/strict.dtd

    不过,为什么这些 URL 上没有任何内容是没有意义的,如果有一些实际的引用会很好......

    【讨论】:

    • 它们应该是 Xml 命名空间名称 - 它应该是一个 Uri。不过,Uri 不需要实际托管任何内容。由于 xaml 引用的 Uris 实际上映射到本地代码程序集,因此您可以在那里托管任何有意义的东西。
    【解决方案2】:

    在您引用的程序集的代码中有 an attribute you can use 将 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 导入映射到代码命名空间的方式。

    【讨论】:

    • 我在项目属性中显示的 AssemblyName 是 Company.Component 并且我试图引用的该程序集中的命名空间是 Company.Component.Behaviors 但当前程序集中的 xaml 文件引用的 [assembly: XmlnsDefinition("http://Behaviors.Component.Company", "Company.Component.Behaviors")] 仍然无法被发现,因此构建中的 xaml 编译步骤失败。还尝试将可选的AssemblyName="Company.Component" 部分添加到程序集属性(有和没有.exe
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2023-03-06
    • 2012-11-06
    相关资源
    最近更新 更多