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

abe*_*nci 6 .net c# wpf visual-studio-2010 wpf-controls

在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>
Run Code Online (Sandbox Code Playgroud)

Mou*_*mit 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>
Run Code Online (Sandbox Code Playgroud)

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

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

 xmlns:fa="http://schemas.fontawesome.io/icons/"
Run Code Online (Sandbox Code Playgroud)

不是这样的

 xmlns:fa="clr-namespace:FontAwesome.WPF;assembly=FontAwesome.WPF"
Run Code Online (Sandbox Code Playgroud)

那么visual studio如何知道dll包含ImageAwesome类的内容!......我只加FontAwesome.WPF.dll过的NuGet ..nothing别的我没..没有额外的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>
Run Code Online (Sandbox Code Playgroud)

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

解:

所以我下载了font.awesome.wpf的源代码..并开始在http://schemas.fontawesome.io/icons/那里搜索文本...最后我找到了assembly.csfont.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")]
Run Code Online (Sandbox Code Playgroud)

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

assembly.cs文件中的分量定义的http://schemas.fontawesome.io/icons/命名空间..所以当我添加fontawesome.wpf DLL ... Visual Studio中得到它使用恢复体力的命名空间定义..和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