<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>WPF on 云雾海的博客</title><link>https://blog.yunwuhai.com/tags/wpf/</link><description>Recent content in WPF on 云雾海的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 14 Jan 2026 22:04:53 +0800</lastBuildDate><atom:link href="https://blog.yunwuhai.com/tags/wpf/index.xml" rel="self" type="application/rss+xml"/><item><title>关于WPF中xmlns的理解</title><link>https://blog.yunwuhai.com/posts/%E6%A1%8C%E9%9D%A2%E7%AB%AF/%E5%85%B3%E4%BA%8Ewpf%E4%B8%ADxmlns%E7%9A%84%E7%90%86%E8%A7%A3/</link><pubDate>Wed, 14 Jan 2026 22:04:53 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E6%A1%8C%E9%9D%A2%E7%AB%AF/%E5%85%B3%E4%BA%8Ewpf%E4%B8%ADxmlns%E7%9A%84%E7%90%86%E8%A7%A3/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E6%A1%8C%E9%9D%A2%E7%AB%AF/%E5%85%B3%E4%BA%8Ewpf%E4%B8%ADxmlns%E7%9A%84%E7%90%86%E8%A7%A3/cover.jpg" alt="Featured image of post 关于WPF中xmlns的理解" /&gt;&lt;h1 id="关于wpf中xmlns的理解"&gt;&lt;a href="#%e5%85%b3%e4%ba%8ewpf%e4%b8%adxmlns%e7%9a%84%e7%90%86%e8%a7%a3" class="header-anchor"&gt;&lt;/a&gt;关于WPF中xmlns的理解&#10;&lt;/h1&gt;&lt;h2 id="命名空间映射"&gt;&lt;a href="#%e5%91%bd%e5%90%8d%e7%a9%ba%e9%97%b4%e6%98%a0%e5%b0%84" class="header-anchor"&gt;&lt;/a&gt;命名空间映射&#10;&lt;/h2&gt;&lt;p&gt;以一个通过Visual Studio直接创建的简单WPF项目为例，我们查看其&lt;code&gt;MainWindow.xaml&lt;/code&gt;文件，这是一个纯粹的窗口：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;&amp;lt;Window x:Class=&amp;#34;Test.MainWindow&amp;#34;&#10; xmlns=&amp;#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;#34;&#10; xmlns:x=&amp;#34;http://schemas.microsoft.com/winfx/2006/xaml&amp;#34;&#10; xmlns:d=&amp;#34;http://schemas.microsoft.com/expression/blend/2008&amp;#34;&#10; xmlns:mc=&amp;#34;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;#34;&#10; xmlns:local=&amp;#34;clr-namespace:Test&amp;#34;&#10; mc:Ignorable=&amp;#34;d&amp;#34;&#10; Title=&amp;#34;MainWindow&amp;#34; Height=&amp;#34;450&amp;#34; Width=&amp;#34;800&amp;#34;&amp;gt;&#10; &amp;lt;Grid&amp;gt;&#10; &#10; &amp;lt;/Grid&amp;gt;&#10;&amp;lt;/Window&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中这一部分很难理解：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;x:Class=&amp;#34;Test.MainWindow&amp;#34;&#10;xmlns=&amp;#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;#34;&#10;xmlns:x=&amp;#34;http://schemas.microsoft.com/winfx/2006/xaml&amp;#34;&#10;xmlns:d=&amp;#34;http://schemas.microsoft.com/expression/blend/2008&amp;#34;&#10;xmlns:mc=&amp;#34;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;#34;&#10;xmlns:local=&amp;#34;clr-namespace:Test&amp;#34;&#10;mc:Ignorable=&amp;#34;d&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;微软官方文档说，这个部分的内容其实叫XAML命名空间映射。&lt;/p&gt;&#10;&lt;h2 id="命名空间重命名"&gt;&lt;a href="#%e5%91%bd%e5%90%8d%e7%a9%ba%e9%97%b4%e9%87%8d%e5%91%bd%e5%90%8d" class="header-anchor"&gt;&lt;/a&gt;命名空间重命名&#10;&lt;/h2&gt;&lt;p&gt;我们知道，在C#中就存在命名空间，也就是我们的namespace。&lt;/p&gt;&#10;&lt;p&gt;而XAML则是微软基于XML开发的一种声明性语言，WPF是XAML最出名的使用者，而关于XAML的解析则由&lt;code&gt;.NET&lt;/code&gt;框架实现，它常被用于定义构造用户界面（UI）。&lt;/p&gt;&#10;&lt;p&gt;显然这是两种不同的语言，但显然两者需要进行交互，那么XAML就需要一种功能来调用命名空间，而这就是xmlns（XML/XAML namespace）的功能。&lt;/p&gt;&#10;&lt;p&gt;我们知道，对于C#中，调用其它命名空间的一种方式就是使用&lt;code&gt;using&lt;/code&gt;语句，比如：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c#" data-lang="c#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而&lt;code&gt;xmlns&lt;/code&gt;也是类似这样的功能，我们可以通过类似于以下的方式创建一个我们自定义于命名空间叫&lt;code&gt;Test&lt;/code&gt;下的一个&lt;code&gt;TestButton&lt;/code&gt;控件：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;xmlns:ts=&amp;#34;clr-namespace:Test&amp;#34;&#10;&amp;lt;ts:TestButton /&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;当然，如果更加准确一点形容，它在C#中应该更加类似于以下这种形式：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c#" data-lang="c#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;ts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestButton&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也就是说，&lt;code&gt;xmlns:（name）&lt;/code&gt;这种格式有点类似于引用命名空间并重命名或重映射，这里就是把&lt;code&gt;Test&lt;/code&gt;这个命名空间重映射为&lt;code&gt;ts&lt;/code&gt;了。&lt;/p&gt;&#10;&lt;p&gt;但是和C#中非常大的不同是，C#可以不重映射，比如直接通过以下形式实现：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c#" data-lang="c#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestButton&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestButton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是XAML中要引用命名空间则必须先使用&lt;code&gt;xmlns&lt;/code&gt;语句将其重映射一遍，其中XAML中调用命名空间时使用的&lt;code&gt;clr-namespace:&lt;/code&gt;是一个固定关键词，在这个关键词后面可以通过类似C#的方式来写命名空间，比如如果&lt;code&gt;TestButton&lt;/code&gt;也是一个命名空间的话，那么就可以通过加&lt;code&gt;.&lt;/code&gt;的方式进行连接：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;xmlns:tb=&amp;#34;clr-namespace:Test.TestButton&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这一点用C#的思想去理解就可以了。&lt;/p&gt;&#10;&lt;p&gt;而事实上，我们的&lt;code&gt;xmlns:local&lt;/code&gt;就是这个功能，它提供的服务就是将项目的命名空间引用起来了，而这个&lt;code&gt;local&lt;/code&gt;可以改成任意其他名称，不过通常我们不用改。&lt;/p&gt;&#10;&lt;h2 id="默认命名空间"&gt;&lt;a href="#%e9%bb%98%e8%ae%a4%e5%91%bd%e5%90%8d%e7%a9%ba%e9%97%b4" class="header-anchor"&gt;&lt;/a&gt;默认命名空间&#10;&lt;/h2&gt;&lt;p&gt;现在我们大概理解了&lt;code&gt;xmlns&lt;/code&gt;的作用，那么让我们重新回顾语句，会发现其中有一个没加&lt;code&gt;:&lt;/code&gt;的语句，即：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;xmlns=&amp;#34;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个语句其实代表了一个默认命名空间，而它后面跟的不是&lt;code&gt;clr-namespace:&lt;/code&gt;而是一个网址。&lt;/p&gt;&#10;&lt;p&gt;事实上这个网址并不是一个网页，而是统一资源标识符（URI），使用这种格式而非命名空间名字，最大的原因是为了保证全局唯一性，因为&lt;code&gt;microsoft.com&lt;/code&gt;这个网址是微软拥有的，所以这个URI只有微软能用，这个URI的信息主要如下：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | | | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 公司 规范 年份 技术 具体组件&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中&lt;code&gt;schemas&lt;/code&gt;代表模式或规范，而&lt;code&gt;WinFx/2006&lt;/code&gt;就是WPF的代号和规范的年份，&lt;code&gt;xaml&lt;/code&gt;代表用于XAML技术，&lt;code&gt;presentation&lt;/code&gt;代表WPF的Presentation层。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;补充一个使用技巧：当你想知道某个命名空间URI对应的实际程序集时，可以查看项目的&lt;code&gt;*.csproj&lt;/code&gt;文件，里面会有相应的引用。比如默认WPF命名空间对应多个程序集引用。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;简单理解，这一个自动生成的&lt;code&gt;xmlns&lt;/code&gt;代表的就是&lt;code&gt;WPF&lt;/code&gt;的整个库，而它没有&lt;code&gt;:&lt;/code&gt;则是因为它将作为默认空间使用，在XAML中任何没有加前缀的控件，都会优先在这个命名空间里面寻找，比如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;&amp;lt;Button Content=&amp;#34;Button&amp;#34; HorizontalAlignment=&amp;#34;Center&amp;#34; VerticalAlignment=&amp;#34;Center&amp;#34;/&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;和我们前面的&lt;code&gt;TestButton&lt;/code&gt;的调用方法不同，前面并没有加任何&lt;code&gt;name:&lt;/code&gt;，所以这种&lt;code&gt;Button&lt;/code&gt;就会直接在&lt;code&gt;xmlns&lt;/code&gt;指向的默认命名空间中寻找。&lt;/p&gt;&#10;&lt;p&gt;否则，我们在前面加一个&lt;code&gt;ts:&lt;/code&gt;：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;&amp;lt;ts:Button Content=&amp;#34;Button&amp;#34; HorizontalAlignment=&amp;#34;Center&amp;#34; VerticalAlignment=&amp;#34;Center&amp;#34;/&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;只是加了一个&lt;code&gt;ts:&lt;/code&gt;，现在就必须在一个&lt;code&gt;xmlns:ts&lt;/code&gt;的命名空间里面寻找了，如果前面没有引用这个空间，或者空间里面没有&lt;code&gt;Button&lt;/code&gt;这个类，那么就会报错。&lt;/p&gt;&#10;&lt;h2 id="特殊的x"&gt;&lt;a href="#%e7%89%b9%e6%ae%8a%e7%9a%84x" class="header-anchor"&gt;&lt;/a&gt;特殊的x&#10;&lt;/h2&gt;&lt;p&gt;我们发现在我们开始举例的XAML代码里面，最开始有一个&lt;code&gt;x:Class&lt;/code&gt;，而后面才出现了&lt;code&gt;xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;并且通过我们刚才对URI的理解，我们发现这个&lt;code&gt;x&lt;/code&gt;的URI和刚刚的&lt;code&gt;xmlns&lt;/code&gt;的很相似，只是它的URI少了&lt;code&gt;/presentation&lt;/code&gt;，这代表它似乎是直接对XAML本身的规范。&lt;/p&gt;&#10;&lt;p&gt;事实上在XAML中&lt;code&gt;x&lt;/code&gt;也确实是一个比较特殊的命名空间，它提供的不是某些控件，而是XAML本身的一些语言特性或特殊操作。&lt;/p&gt;&#10;&lt;p&gt;而&lt;code&gt;x:Class&lt;/code&gt;就是这个命名空间中一个比较重要的操作，它提供了XAML和C#后台代码的连接，比如在XAML中我们看到：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;x:Class=&amp;#34;Test.MainWindow&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这其实对应了C#后台代码的：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c#" data-lang="c#"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MainWindow&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;MainWindow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;InitializeComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以发现，它们的命名空间和类名完美对应上了，在编译时，两个板块才能够连接在一起。&lt;/p&gt;&#10;&lt;p&gt;而它的原理就是指定了这个XAML编译后生成的局部类(partial class)应该与哪个C#类合并，这也解释了为什么C#中的类是&lt;code&gt;partial&lt;/code&gt;的。&lt;/p&gt;&#10;&lt;p&gt;显然&lt;code&gt;x&lt;/code&gt;在工作中并不是调用某个C#的类或方法，而是作为一种特殊工具来操作XAML本身。&lt;/p&gt;&#10;&lt;p&gt;而&lt;code&gt;x&lt;/code&gt;的常用功能很多，比如我们在XAML中通过语句添加了一个Button控件，就像我们刚才那样：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;&amp;lt;Button Content=&amp;#34;Button&amp;#34; HorizontalAlignment=&amp;#34;Center&amp;#34; VerticalAlignment=&amp;#34;Center&amp;#34;/&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;我们或许可以在VS的布局界面看到这个按钮，但是我们该如何在C#中调用这个按钮呢，其实要做的就是添加&lt;code&gt;x:Name&lt;/code&gt;，比如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;&amp;lt;Button x:Name=&amp;#34;button&amp;#34; Content=&amp;#34;Button&amp;#34; HorizontalAlignment=&amp;#34;Center&amp;#34; VerticalAlignment=&amp;#34;Center&amp;#34;/&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;现在，我们就可以在C#后台代码中通过变量名&lt;code&gt;button&lt;/code&gt;直接访问控制这个控件了，操作变得非常简单。&lt;/p&gt;&#10;&lt;p&gt;关于&lt;code&gt;x&lt;/code&gt;，常用的指令有：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;x:Class&lt;/code&gt; - 连接XAML和C#后台代码&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;x:Name&lt;/code&gt; - 给控件起名字，用于后台访问&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;x:Key&lt;/code&gt; - 给资源（样式、模板等）起标识符&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;x:Type&lt;/code&gt; - 表示一个类型&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;x:Static&lt;/code&gt; - 引用静态成员&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;另外&lt;code&gt;x&lt;/code&gt;这个名字是可以改的，因为它只是一个约定俗成的名字，其本身仍然遵守XAML的语法规则。但是通常不建议修改，因为一些库里面习惯了这个约定俗成的名字，改了很可能会出现一些意想不到的错误，而且也会降低代码可读性。&lt;/p&gt;&#10;&lt;h2 id="用于设计的d"&gt;&lt;a href="#%e7%94%a8%e4%ba%8e%e8%ae%be%e8%ae%a1%e7%9a%84d" class="header-anchor"&gt;&lt;/a&gt;用于设计的d&#10;&lt;/h2&gt;&lt;p&gt;我们还可以看到一个自动生成的命名空间：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;xmlns:d=&amp;#34;http://schemas.microsoft.com/expression/blend/2008&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;d=Design，代表设计时。&lt;/p&gt;&#10;&lt;p&gt;它和&lt;code&gt;x&lt;/code&gt;类似，不直接提供控件但是提供一些特殊服务，而这里的服务则是一些供Visual Studio设计器或者Blend中显示，而运行时会消失的特殊属性，比如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;&amp;lt;Window&#10; xmlns:d=&amp;#34;http://schemas.microsoft.com/expression/blend/2008&amp;#34;&#10; d:DesignHeight=&amp;#34;450&amp;#34;&#10; d:DesignWidth=&amp;#34;800&amp;#34;&amp;gt;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这是在设计器里面提供了一个预览尺寸，方便在设计界面的时候看到效果，但是实际运行时窗口的大小则和这两个属性无关。&lt;/p&gt;&#10;&lt;p&gt;在实际项目开发中，特别是使用MVVM模式时，&lt;code&gt;d:&lt;/code&gt;命名空间提供的设计时数据功能非常有用。比如：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;d:DataContext=&amp;#34;{d:DesignInstance Type=local:MainViewModel}&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这可以在设计器里显示绑定数据的效果，避免&amp;quot;设计时一片空白&amp;quot;的问题。所以对于专业WPF开发，&lt;code&gt;d:&lt;/code&gt;是很有价值的工具。&lt;/p&gt;&#10;&lt;p&gt;不过你如果担心它会污染你的代码，出现一些意想不到的错误，其实可以放心，因为下面一个命名空间的功能解决了这个问题。&lt;/p&gt;&#10;&lt;h2 id="标记兼容性的mc"&gt;&lt;a href="#%e6%a0%87%e8%ae%b0%e5%85%bc%e5%ae%b9%e6%80%a7%e7%9a%84mc" class="header-anchor"&gt;&lt;/a&gt;标记兼容性的mc&#10;&lt;/h2&gt;&lt;p&gt;继续往下看，我们可以发现两个语句：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-xaml" data-lang="xaml"&gt;xmlns:mc=&amp;#34;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;#34;&#10;mc:Ignorable=&amp;#34;d&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里面都出现了&lt;code&gt;mc&lt;/code&gt;命名空间，mc=Markup Compatibility，即标记兼容性。&lt;/p&gt;&#10;&lt;p&gt;这个命名空间通常与&lt;code&gt;d:&lt;/code&gt;配合使用，它会告诉编译器，有些标记只是设计时使用的，运行的时候可以忽略，即&lt;code&gt;mc:Ignorable=&amp;quot;d&amp;quot;&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;如果没有这个声明，编译器在看到&lt;code&gt;d:DesignHeight&lt;/code&gt;时可能会产生困惑，这个属性是什么，自己似乎并未见过（因为这个功能只在设计器或Blend中被调用实现了）。&lt;/p&gt;&#10;&lt;p&gt;此外，利用mc的一些特性，可以将某些实验功能或未来版本的功能标记为可忽略，这样旧版本的编译器就不会报错。&lt;/p&gt;&#10;&lt;p&gt;同样，大部分时候我们不需要关注这个标记的用法，需要用的时候再自行查询即可。&lt;/p&gt;&#10;&lt;h2 id="总结xmlns的层次结构"&gt;&lt;a href="#%e6%80%bb%e7%bb%93xmlns%e7%9a%84%e5%b1%82%e6%ac%a1%e7%bb%93%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;总结：xmlns的层次结构&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;默认命名空间&lt;/strong&gt; (&lt;code&gt;xmlns=&amp;quot;...&amp;quot;&lt;/code&gt;) - WPF核心控件库&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;x命名空间&lt;/strong&gt; (&lt;code&gt;xmlns:x=&amp;quot;...&amp;quot;&lt;/code&gt;) - XAML语言特性&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;自定义映射&lt;/strong&gt; (&lt;code&gt;xmlns:别名=&amp;quot;clr-namespace:...&amp;quot;&lt;/code&gt;) - 引用自己的代码&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;设计时支持&lt;/strong&gt; (&lt;code&gt;xmlns:d=&amp;quot;...&amp;quot;&lt;/code&gt;) - 设计器辅助功能&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;兼容性处理&lt;/strong&gt; (&lt;code&gt;xmlns:mc=&amp;quot;...&amp;quot;&lt;/code&gt;) - 版本和工具兼容&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;这种分层设计让XAML既能使用框架控件，又能扩展自定义功能，同时支持设计时和运行时的不同需求。&lt;/p&gt;&#10;</description></item></channel></rss>