WPF入门(二) 谈x
wpf吧
全部回复
仅看楼主
level 10
狠有毅毅 楼主
1L Microsoft
2013年06月11日 17点06分 1
level 10
狠有毅毅 楼主

楼主将在这篇文章中讲解一下x。这里所说的x就是之前提到的那个默认定义的一个命名空间:xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
那么这个命名空间究竟是干什么用的呢,其实我们在每个新建的WPF项目中都会看到在根节点中有一个x:Class=”…”这样的Attribute,首先楼主想说x这个命名空间中包含的都是一些与Xaml解析相关的类。像C#那样,Xaml也会被编译成中间语言存储在程序集中。在解析过程中,我们可能需要告诉编译器一些信息,比如Xaml声明的元素的访问级、Xaml关联的C#类、Xaml声明的一些元素的名称等等。因此我们可以通过x这个命名空间控制Xaml编译器的一些行为。
一个Xaml标签的大部分的Attribute都对应着该类的属性,比如Button标签的Padding属性,这些属性是这个Button对象本身就有的,然而有些时候这些对象的属性并不能满足我们的需求,这时我们可以通过x空间中的一些Attribute强制赋予这些对象某些特性,就比如x:Class,这个Attribute并不是对象本身自带的属性,而是强制贴上去的。
接下来描述一下x命名空间中一些常用的Attribute:
2013年06月11日 17点06分 2
level 10
狠有毅毅 楼主

1. x:Class
这个Attribute的作用就是告诉Xaml编译器将Xaml编译出的结果与制定的类合并。使用x:Class要注意几点:
(1) x:Class只能用于根节点
(2) x:Class的根节点类型必须与结合的类文件所指示的类型一致
比如,如果后台文件是继承自Window类的,那么这个时候根节点必须要是Window,同理如果后台文件是继承自Page、UserControl或者是其他自定义的类,那么根节点也必须要是对应的类名。
(3) x:Class指示的类型必须是分部类
我们看到MainWindow.xaml的后台文件,该类声明时使用了partial关键字public partial class MainWindow : Window 其实可以把Xaml文件理解成后台文件的另一个分部类,这样做是为了把UI和逻辑分离开来(和asp.net的aspx文件很类似),使我们能更好地设计程序。
其实在我们添加新Window或者Page的时候,微软会自动生成一个对应的.g.i.cs的分部类,这个文件用于处理链接程序以及一些控件初始化的操作,也就是我们在后台.xaml.cs文件中看到的InitializeComponent方法。一般来说我们不需要更改这些文件的结构,只是如果我们把后台的文件改名的话,切勿忘记在Xaml文件中将x:Class改成对应的名字,不然会提示类文件找不到。我们可以导航到InitializeComponent方法来看一下微软是怎么实现这个方法的:
一堆复杂的代码,可见微软已经帮我们把链接程序的功能都实现了,并且当我们在Xaml文件中注册事件时,微软会自动更新这里的代码,帮我们把复杂的一些过程都处理掉了,和Winform中的.designer.cs文件有点类似。
我们在Xaml文件中添加几个控件,代码如下:
后台别忘记加上Button_Click的方法,这里只是示例,所以没有任何逻辑代码:
这个时候我们再导航进InitializeComponent方法中看下Connect方法的代码:
这里可以看到#line的预编译指令以及注册路由事件的代码,这也就是为什么我们在Xaml中添加事件就立即能实现的原因,这并不是什么神秘的事情,只不过是微软将这些细节性的代码自动在这里生成了而已。
2013年06月11日 17点06分 3
level 10
狠有毅毅 楼主

2. x:ClassModifier
这个Attribute的作用是通知Xaml编译器生成的类具有怎样的访问类型。使用x:ClassModifier有几点要注意:
(1) 标签必须具有x:Class
(2) x:ClassModifier的值必须和x:Class指定类的访问级别一致(默认是public)
由于我们后台类的默认修饰符是public,所以我们可以不用添加这个Attribute,因为默认是public,但是如果我们希望编译出来的类文件是internal的,那么我们则必须手动声明这个标签,假设我们直接把后台类的修饰符改成internal,我们编译时会报错:
错误说是后台的分部类MainWindow的访问修饰符不一致,这个时候我们手动添加这个Attribute便能解决这个问题,代码如下:
用过IL反编译工具的可以自己试着把这个wpf项目反编译成IL查看一下,此时生成的MainWindow这个类不是public的
2013年06月11日 17点06分 4
level 10
狠有毅毅 楼主

3. x:Name
这个Attribute在Xaml中十分常见,我们知道Xaml中的每个标签都对应着一个对象,为了方便操作这些对象,最好就是能直接通过这些对象的引用操作它们,那么x:Name的功能就在于此,我们修改代码如下:
在后台的Button_Click中添加处理代码:
这个时候我们在后台文件中可以直接获得这个TextBlock的引用并修改它的属性,为什么能获得这个引用呢,大家可以再次跑到InitializeComponent所在的.g.i.cs文件中,会发现多出tbNum这个对象的声明,因此我们才可以在后台的类文件中直接操作这个对象了(和Winform一样)
另外,Name和x:Name有什么区别呢?Name是定义在FrameworkElement(所有WPF控件的基类)中的,所以我们可以用Name代替x:Name,但是我们使用x:Name可以使许多没有Name属性的元素也拥有它的名字(引用),因为为了统一规范,Xaml代码中统一使用x:Name代替Name。
2013年06月11日 17点06分 5
level 10
狠有毅毅 楼主

4. x:FieldModifier
当我们给元素设置了x:Name之后,这些对象自动生成了引用,引用是默认为internal的,这个时候,我们就可以用x:FieldModifier为它们指定访问修饰符了,修改代码:
<TextBlock x:Name="tbNum" x:FieldModifier="public" FontSize="72" Text="0" HorizontalAlignment="Center" />
这个时候我们再跑到.g.i.cs文件中查看该TextBlock的访问修饰符变成了public。
2013年06月11日 17点06分 6
level 10
狠有毅毅 楼主

5. x:Key
相信很多盆友用到过 键值对,通过键查找对应的值再方便不过了,Xaml中,我们常常定义许多Resources,这个时候为这些Resource设置Key,则可以很方便的在Xaml代码中使用对应Key的Resource(Resource以后会详细介绍)。看个简单的例子:
我们看到{StaticResource ButtonText} 这里通过Key获取了Window.Resources中的一个字符串资源。
2013年06月11日 17点06分 8
level 10
狠有毅毅 楼主

6. x:Shared
这个Attribute和x:Key一起使用,默认值为true。我们每次检索Resource的时候,默认是获得同一个资源对象的引用,如果将x:Shared设为false,则每次检索Resource的时候都会new一个新的对象出来。
2013年06月11日 17点06分 9
level 10
狠有毅毅 楼主

以上讲述的都是x空间中一些Attribute,接下来楼主要讲述x空间中的Markup Extension,也就是MarkupExtension的一些派生类
1. x:Type
我们不仅会用到数据类型的对象,有时候还会用到数据类型本身。也就是Type对象,反射中不是会用到它么~这里楼主作个记号 以后在一些需要用到的情况再描述它
2. x:Null
我们在C#代码中用null表示空,那么在Xaml中则是用{x:Null}表示为空,一般用在Style中比较常见。
3. x:Array
楼主这里也作个记号,以后讲到数据源的时候再讲解。
4. x:Static
这个标记扩展比较常用,我们在后台类文件中写的静态属性或字段,通过x:Static可以在Xaml中访问,比如我们在后台文件添加如下代码:
在Xaml文件修改代码如下
别忘记添加命名空间,我们在Xaml中通过x:Static可以获得后台类文件下的WindowTitle静态属性。运行后会发现Window的Title改变了。
2013年06月11日 17点06分 10
level 10
狠有毅毅 楼主

Xaml中还有两个指令元素x:Code和x:XData,但是楼主不推荐大家使用,所以就不再赘述,如果有强迫症的盆友可以自己查询一些相关资料 了解一下。
2013年06月11日 17点06分 11
level 10
楼主讲的有点儿跳跃啊,事件,面向对象在wpf中的应用这些也稍微讲一下吧,最好能再出道题,还有简单的动画应用
2013年06月13日 03点06分 12
level 10
和我看的深入浅出wpf神似!支持楼主!
2014年08月10日 01点08分 13
level 3
楼主继续更,wpf吧需要你
2015年10月26日 14点10分 14
level 7
不是刘铁锰老师的马甲吧
2015年10月27日 06点10分 15
1