首页 > 代码库 > WPF名称空间
WPF名称空间
一 C#名称空间
C#中,将类组织在合适的名称空间中,这样便可以在不同的名称空间中创建同名的类,而在使用同名类时,需要指定类是属于哪一个名称空间,以此来区别不同的同名类。这就像,1班有一个“张伟”,2班也有一个“张伟”,为了区分这两个同名的“张伟”,必须加上“1班的”或者“2班的”限定条件一样,名称空间就是此处用来区别同名“张伟”的限定条件,它的作用就是避免同名的冲突。
下面通过一个简单的实验来进一步说明名称空间的作用。
实验1
1 新建空解决方案WpfNamespaceExp。
2 在解决方案WpfNamespaceExp下,新建类库ExampleLibrary1与ExampleLibrary2,在类库ExampleLibrary1与ExampleLibrary2下新建同名类Student。
3 新建WPF应用程序WpfNamespaceExp,添加对类库ExampleLibrary1与ExampleLibrary2的引用。
4 在WPF项目中的MainWindow.xaml.cs文件中添加以下代码:
using ExampleLibrary1; using ExampleLibrary2; Student s = new Student();
VS会给出以下错误提示:
“Student”是“ExampleLibrary1.Student”和“ExampleLibrary2.Student”之间的不明确的引用。
这个错误提示的意思是:
当名称空间ExampleLibrary1和ExampleLibrary2中同时存在Student类的定义的时候,必须显式的指明Student类来自于哪个名称空间,要不然,编译器将无法确定你到底想要使用的是哪个名称空间下的Student类。
5 使用下面的代码,改正第4步出现的错误。
ExampleLibrary1.Student s = new ExampleLibrary1.Student();这句代码可以明确告诉编译器,使用的Student类来自于名称空间ExampleLibrary1。
6 使用下面的代码给名称空间ExampleLibrary1与ExampleLibrary2取个别名。
using el1 = ExampleLibrary1; using el2 = ExampleLibrary2; el1.Student s = new el1.Student();
这种写法在名称空间的名称较长时,比较有效。
二 WPF名称空间
这里所说的WPF名称空间指的就是XAML的名称空间。
C#中使用“using 名称空间;”的语法来引用名称空间,WPF中使用下面的语法在XAML中引用名称空间。
xmlns:映射名="clr-namespace:类库中名称空间的名字;assembly=类库文件名"
这里提到的映射名类似于第一部分中提到的名称空间的别名。
那么,使用这个语法在XAML中来引用实验1中的两个名称空间,代码如下所示:
xmlns:el1="clr-namespace:ExampleLibrary1;assembly=ExampleLibrary1" xmlns:el2="clr-namespace:ExampleLibrary2;assembly=ExampleLibrary2"
一旦,我们将名称空间引进XAML文档,就可以使用该名称空间中的类了。
使用名称空间中的类,采用下面的语法格式:
<映射名:类名>...</映射名:类名>
那么,使用这个语法在XAML中来使用实验1中ExampleLibrary1名称空间的Student类的代码,如下所示:
<el1:Student></el1:Student>
下面再来补充两点说明:
(1) xmlns是XML Namespace的缩写。
(2) 冒号后面的映射名是可选的,也就是说可以不使用映射名。但是,WPF中不加映射名的默认名称空间已经被WPF的主要名称空间占用,所以,引用的名称空间都需要加上映射名。
(注:何为WPF的主要名称空间?
打开实验1的MainWindow.xaml文件,其中的名称空间http://schemas.microsoft.com/winfx/2006/xaml/presentation就是WPF的主要名称空间,该名称空间中包含WPF中用到的Window,Grid等类的定义,该名称空间不使用映射名,是默认的名称空间。)
同样,通过一个简单的实验来进一步了解WPF名称空间的使用。
实验2
实验2是在实验1的基础上进行的。
1 打开实验1中的MainWindow.xaml文件,阅读以下代码。
<Window x:Class="WpfNamespaceExp.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>
针对这段代码说明两点:
(1)
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
我们已经知道:名称空间http://schemas.microsoft.com/winfx/2006/xaml/presentation是WPF中不使用映射名的默认名称空间,它是WPF中最主要的名称空间。在代码中尝试删除该名称空间,将会产生以下错误提示:
未找到类型“Window”(“Grid”)。
这进一步说明Window,Grid等类的定义就在名称空间http://schemas.microsoft.com/winfx/2006/xaml/presentation中。
(2)
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="WpfNamespaceExp.MainWindow"
名称空间http://schemas.microsoft.com/winfx/2006/xaml,使用映射名x,该名称空间中包含的类均与解析XAML语言相关,也被称为“XAML名称空间”。
代码中的x:Class类便来自于x名称空间,该名称空间中还包含x:Name,x:Key等类的定义。
代码中的x:Class告诉XAML编译器将XAML标签(此处的Window标签)的编译结果与后台代码中的哪个类(MainWindow.xaml.cs文件中定义的MainWindow类)合并。
2 在MainWindow.xaml文件中,添加以下代码:
xmlns:el1="clr-namespace:ExampleLibrary1;assembly=ExampleLibrary1" <el1:Student/>(位于<Grid></Grid>标签之间)
编译代码,会在<el1:Student/>代码行产生以下错误提示:
向类型为“System.Windows.Controls.UIElementCollection”的集合中添加值引发了异常。”
这是因为,向Grid标签中添加子标签时,子标签的类型必须是可以被UIElementCollection集合接收的类型,很显然我们的自定义类型Student是不满足这个要求的。
为了修正这个错误,我们在ExampleLibrary1类库中添加新的类ExampleButton,使该类继承自Button类,要想使用Button类,需要添加对程序集 PresentationFramework、PresentationCore、System.Xaml、WindowsBase的引用,同时在代码中添加对名称空间System.Windows.Controls的引用。完成ExampleButton类后,在MainWindow.xaml文件中的<Grid></Grid>标签之间添加代码<el1:ExampleButton/>,一切正常,程序不再报错。
好了,就写到这里了,通过本文简单介绍了WPF名称空间的使用,我就不做总结了。