问题是大多数 wpf 开发人员都知道它是如何工作的但是当你要解释时,它变得非常困难..下面是我的尝试...由于简化它变得很大,但我希望如果你读到最后,你会理解定义是如何工作的..
设想:
我是一名 wpf 初学者开发人员,正在 goggle 上寻找 wpf spinner。我有一个链接字体.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 类!!! ...我只添加了FontAwesome.WPF.dll
通过 nuget ..我没有做任何其他事情..没有额外的 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
and fa:CssClassNameConverter
班级...他们来自different namespace
(使用我已经检查过的代码)..并且我没有指定额外的一行来指定任何FontAwesome.WPF
or FontAwesome.WPF.Converters
命名空间..那么神奇是怎么回事!! ..
解决方案:
所以我下载了源代码字体.awesome.wpf..并开始搜索文本http://schemas.fontawesome.io/icons/
在那里......最后我找到了以下几行assembly.cs
font.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")]
整个事情(魔术!!)向我透露了..
In assembly.cs
文件定义的组件http://schemas.fontawesome.io/icons/
命名空间..所以当我添加 fontawesome.wpf dll 时... Visual Studio 使用反射获得了它的命名空间定义.. 那么 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