在Visual Studio中创建新的WpfApplication项目时,您将获得以下XAML。将URL http://schemas.microsoft.com/winfx/2006/xaml/presentation复制并粘贴到浏览器中我希望看到XSD文件定义,但是出现错误。为什么?
感谢。
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</Window>
答案 0 :(得分:9)
问题是大多数wpf开发者都知道它是如何工作的但是当你要解释时,它变得非常困难......下面是我的尝试...由于简化它变成了很大,但我希望如果你读到最后,你会明白定义是如何运作的。
<强>情境:强>
我是一名wpf初学者,并在goggle上搜索wpf微调器。我得到了font.awesome.wpf的链接..所以我开始尝试了。下面的代码写在文档中以添加微调器..
<Window x:Class="DemoFontAwesome.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:fa="http://schemas.fontawesome.io/icons/"
Title="MainWindow" Height="350" Width="525">
<Grid Margin="20">
<fa:ImageAwesome Icon="AlignCenter" Spin="False" Height="48" Width="48" />
</Grid>
</Window>
哇太棒了......工作得很好!!! ......
突然!!我发现我在那里增加了一条线
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小时后,我最终得到了以下代码..
<Window x:Class="DemoFontAwesome.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:fa="http://schemas.fontawesome.io/icons/"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<fa:CssClassNameConverter Mode="FromIconToString" x:Key="sdfsdf"></fa:CssClassNameConverter>
</ResourceDictionary>
</Window.Resources>
<Grid Margin="20">
<fa:ImageAwesome Icon="AlignCenter" Spin="False" Height="48" Width="48" />
</Grid>
</Window>
值得注意的部分是fa:ImageAwesome
和fa:CssClassNameConverter
类......它们来自different namespace
(使用后面的代码我已经检查过它)..而且我没有指定一行额外的行指定FontAwesome.WPF
或FontAwesome.WPF.Converters
命名空间中的任何一个..那么魔术是如何发生的! ..
<强>解决方案:强>
所以我下载了font.awesome.wpf的源代码..并开始在那里搜索文本http://schemas.fontawesome.io/icons/
...最后我在font.awesome的assembly.cs
中找到了以下行。 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看起来像是指向上的位置 网络,但他们没有。使用URI格式是因为它使不同的组织不太可能 无意中使用相同的命名空间创建不同的基于XML的语言。因为域名 schemas.microsoft.com归Microsoft所有,只有Microsoft才会在XML命名空间名称中使用它。
XAML中使用的XML命名空间之间没有一对一映射的另一个原因 和.NET名称空间是因为它会使您的XAML文档复杂化。问题 这是WPF包含十几个名称空间(所有名称空间都以System.Windows开头)。如果 每个.NET命名空间都有不同的XML命名空间,您需要为每个命名空间指定正确的命名空间 以及你使用的每一个控制,很快就会变得混乱。相反,WPF的创建者选择将所有的组合起来 将这些.NET命名空间转换为单个XML命名空间。这是因为在不同的.NET中 作为WPF一部分的命名空间,没有任何具有相同名称的类。 命名空间信息允许XAML解析器找到正确的类。例如,当它看起来 在Window和Grid元素中,它看到它们被放置在默认的WPF名称空间中。然后呢 搜索相应的.NET命名空间,直到找到System.Windows.Window和System。 Windows.Controls.Grid
答案 1 :(得分:0)
命名空间是URI(URN或URL),但URI并不总是URL。用于命名空间的URI旨在唯一标识名称以防止发生冲突。当时XML命名空间工作组决定使用已知的技术来唯一标识事物:URI。
因此,很多人认为它应该指向一些真实的东西。偶尔这是真的,但更多时候它不是,并且它并不意味着。它是 identitifier ,而不是位置。
对于模式,它可用于表示目标名称空间,该名称空间是必须在需要针对模式进行验证的文档中使用的名称空间。要获得架构,您必须询问供应商。在这种情况下,可以在类似于C:\Program Files (x86)\Microsoft Visual Studio 10.0\Xml\Schemas
的位置找到模式,查找wpfe.xsd
(但是,为了更加困惑,Microsoft决定为目标名称空间创建别名,这就是为什么你不会看到你提到的相同名称空间的原因。