http://schemas.microsoft.com/winfx/2006/xaml/presentation定义

在Visual Studio中创建新的WpfApplication项目时,您将获得以下XAML。 将URL http://schemas.microsoft.com/winfx/2006/xaml/presentation复制并粘贴到浏览器中我希望看到XSD文件定义,但是出现错误。 为什么?

谢谢。

    

问题是大多数wpf开发人员知道它如何工作的 ,但当你要解释时,它变得非常困难..下面是我的尝试…由于简化它变大但我希望如果你读到最后,你会明白定义的东西如何运作..

场景:

我是一名wpf初学者开发人员并在goggle上搜索wpf微调器。 我有一个font.awesome.wpf的链接..所以我开始尝试它。 下面的代码写在文档中添加微调器..

      

哇太棒了….它工作得很好!!! …

突然!! 我发现我在那里添加了一条线

  xmlns:fa="http://schemas.fontawesome.io/icons/" 

不是这样的

  xmlns:fa="clr-namespace:FontAwesome.WPF;assembly=FontAwesome.WPF" 

那么visual studio如何知道哪个dll包含ImageAwesome类!!! …我只通过nuget添加了FontAwesome.WPF.dll ..没有其他我做..没有额外的xsd或xml文件那里..架构链接( http://schemas.fontawesome.io/icons/ )不是可用……那怎么样? …奇怪!!

然而,1小时后,我最终得到以下代码..

           

值得注意的部分是fa:ImageAwesomefa:CssClassNameConverter类……它们来自different namespace (使用后面的代码我已经检查过它)..并且我没有指定一个额外的行来指定任何FontAwesome.WPFFontAwesome.WPF.Converters命名空间..那么魔术怎么回事!! ..

解:

所以我下载了font.awesome.wpf的源代码..并开始搜索文本http://schemas.fontawesome.io/icons/那里……最后我在assembly.cs中找到了以下的字体。 awesome.wpf项目..

 [assembly: AssemblyVersion("4.5.0.*")] [assembly: AssemblyFileVersion("4.5.0.7")] [assembly: XmlnsPrefix("http://schemas.fontawesome.io/icons/", "fa")] [assembly: XmlnsDefinition("http://schemas.fontawesome.io/icons/", "FontAwesome.WPF")] [assembly: XmlnsDefinition("http://schemas.fontawesome.io/icons/", "FontAwesome.WPF.Converters")] 

整个事情(魔术!!)向我揭示..

assembly.cs文件中,组件定义了http://schemas.fontawesome.io/icons/名称空间..所以当我添加fontawesome.wpf dll时… visual studio使用refection获取它的名称空间定义..所以vs如何知道fa tag refers to …所以这就是如何解决我… 🙂

一些理论

XML名称空间名称与任何特定的.NET名称空间不匹配。 XAML的创建者选择此设计有几个原因。 按照惯例,XML命名空间通常是统一资源标识符(URI),因为它们在这里。 这些URI看起来像是指向Web上的某个位置,但它们却没有。 使用URI格式是因为它使得不同组织不太可能无意中使用相同的命名空间创建不同的基于XML的语言。 由于域schemas.microsoft.com归Microsoft所有,因此只有Microsoft才会在XML命名空间名称中使用它。

XAML和.NET名称空间中使用的XML名称空间之间没有一对一映射的另一个原因是因为它会使您的XAML文档复杂化。 这里的问题是WPF包含十几个名称空间(所有名称空间都以System.Windows开头)。 如果每个.NET命名空间具有不同的XML命名空间,则需要为您使用的每个控件指定正确的命名空间,这很快就会变得混乱。 相反,WPF的创建者选择将所有这些.NET命名空间组合到一个XML命名空间中。 这是有效的,因为在作为WPF一部分的不同.N​​ET命名空间中,没有任何具有相同名称的类。 命名空间信息允许XAML解析器找到正确的类。 例如,当它查看Window和Grid元素时,它会看到它们被放置在默认的WPF名称空间中。 然后它搜索相应的.NET命名空间,直到找到System.Windows.Window和System。 Windows.Controls.Grid

命名空间是URI(URN或URL),但URI并不总是URL。 用于命名空间的URI旨在唯一标识名称以防止冲突。 当时的XML命名空间工作组决定使用已知的技术来唯一标识事物:URI。

结果,很多人认为它应该指向一些真实的东西。 偶尔这是真的,但更多时候它不是,而且它并不意味着 。 它是一个识别者 ,而不是一个位置

对于模式,它可用于表示目标名称空间,该名称空间是必须在需要针对模式进行validation的文档中使用的名称空间。 要获取架构,您必须询问供应商。 在这种情况下,架构可以在类似或等于C:\Program Files (x86)\Microsoft Visual Studio 10.0\Xml\Schemas ,查找wpfe.xsd (但是,为了更加困惑,微软决定为目标命名空间创建别名,这就是为什么你不会看到你提到的相同命名空间的原因。