码迷,mamicode.com
首页 > 其他好文 > 详细

WPF名称空间

时间:2014-08-09 18:43:48      阅读:877      评论:0      收藏:0      [点我收藏+]

标签:wpf名称空间   c#名称空间   xaml名称空间   x名称空间   映射名   

一 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名称空间的使用,我就不做总结了。

 

 

 

 

WPF名称空间,布布扣,bubuko.com

WPF名称空间

标签:wpf名称空间   c#名称空间   xaml名称空间   x名称空间   映射名   

原文地址:http://blog.csdn.net/yl2isoft/article/details/38453703

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!