关于WPF中xmlns的理解

关于WPF中xmlns的理解 命名空间映射 以一个通过Visual Studio直接创建的简单WPF项目为例,我们查看其MainWindow.xaml文件,这是一个纯粹的窗口: <Window x:Class="Test.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Test" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> </Grid> </Window> 其中这一部分很难理解: x:Class="Test.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Test" mc:Ignorable="d" 微软官方文档说,这个部分的内容其实叫XAML命名空间映射。 命名空间重命名 我们知道,在C#中就存在命名空间,也就是我们的namespace。 而XAML则是微软基于XML开发的一种声明性语言,WPF是XAML最出名的使用者,而关于XAML的解析则由.NET框架实现,它常被用于定义构造用户界面(UI)。 显然这是两种不同的语言,但显然两者需要进行交互,那么XAML就需要一种功能来调用命名空间,而这就是xmlns(XML/XAML namespace)的功能。 我们知道,对于C#中,调用其它命名空间的一种方式就是使用using语句,比如: using System.Collections.Generic; List<string> list = new List<string>(); 而xmlns也是类似这样的功能,我们可以通过类似于以下的方式创建一个我们自定义于命名空间叫Test下的一个TestButton控件: xmlns:ts="clr-namespace:Test" <ts:TestButton /> 当然,如果更加准确一点形容,它在C#中应该更加类似于以下这种形式: using ts = Test; ts.TestButton = new ts.TestButton(); 也就是说,xmlns:(name)这种格式有点类似于引用命名空间并重命名或重映射,这里就是把Test这个命名空间重映射为ts了。 但是和C#中非常大的不同是,C#可以不重映射,比如直接通过以下形式实现: Test.TestButton = new Test.TestButton; 但是XAML中要引用命名空间则必须先使用xmlns语句将其重映射一遍,其中XAML中调用命名空间时使用的clr-namespace:是一个固定关键词,在这个关键词后面可以通过类似C#的方式来写命名空间,比如如果TestButton也是一个命名空间的话,那么就可以通过加.的方式进行连接: xmlns:tb="clr-namespace:Test.TestButton" 这一点用C#的思想去理解就可以了。 而事实上,我们的xmlns:local就是这个功能,它提供的服务就是将项目的命名空间引用起来了,而这个local可以改成任意其他名称,不过通常我们不用改。 默认命名空间 现在我们大概理解了xmlns的作用,那么让我们重新回顾语句,会发现其中有一个没加:的语句,即: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 这个语句其实代表了一个默认命名空间,而它后面跟的不是clr-namespace:而是一个网址。 事实上这个网址并不是一个网页,而是统一资源标识符(URI),使用这种格式而非命名空间名字,最大的原因是为了保证全局唯一性,因为microsoft.com这个网址是微软拥有的,所以这个URI只有微软能用,这个URI的信息主要如下: http://schemas.microsoft.com/winfx/2006/xaml/presentation | | | | | 公司 规范 年份 技术 具体组件 其中schemas代表模式或规范,而WinFx/2006就是WPF的代号和规范的年份,xaml代表用于XAML技术,presentation代表WPF的Presentation层。 补充一个使用技巧:当你想知道某个命名空间URI对应的实际程序集时,可以查看项目的*.csproj文件,里面会有相应的引用。比如默认WPF命名空间对应多个程序集引用。 简单理解,这一个自动生成的xmlns代表的就是WPF的整个库,而它没有:则是因为它将作为默认空间使用,在XAML中任何没有加前缀的控件,都会优先在这个命名空间里面寻找,比如: ...

January 14, 2026 · 云雾海