技术开发 频道

未来的GDI:WPF技术纵览

WPF中的新概念

WPF中引入了非常多的概念、新的编程方法来提高编程的效率。为了方便用户的编码和访问,WPF引入了一个新的属性系统。在这个系统中,由两个非常重要的概念:Attached属性和Dependency属性。

=     Attached属性

 

对于Attached属性,最直接的理解就是在某个类中定义的属性可以用于其他任何适当的地方。两个类可以没有任何的关系。请看下面的例子:

<DockPanel>

<Button x:Name="BtnName" DockPanel.Dock="Left"/>
</DockPanel>

这段代码实现的功能就是把名称为BtnNameButton元素停靠在它的父元素的左边。在窗口进行布局处理时,DockPanel读出它的值,由于DockPanel.DockProperty是一个Attached属性,所以Button类不必知道DockPanel的工作原理。这种技术也真正体现了软件开发中的组件合成和重用的思想。

与这段XAML代码对应的C#代码调用是这样的:

DockPanel.SetDock( BtnName, Dock.Left );

=     Dependency属性

 

Dependency属性提供的功能比Attached属性更加丰富。在我们的应用程序开发中,最显著的三项功能是:

1)      属性值的变化通知功能。

2)      属性值的继承特征。

3)      属性值支持多个提供对象(数据源)。

Dependency属性最大的特点就是内建的变化通知功能。提供Dependency属性功能主要是为了直接在XAML标记语言提供丰富的功能。WPF的友好设计的关键就是大量的使用属性。如果没有Dependency属性,我们将不得不编写大量的代码。

在任何时候,只要Dependency属性的值发生了变化,WPF可以自动地根据属性的元数据触发不同的行为。Dependency属性的这种内建变化通知所提供的最值得注意的就是属性触发器(Property Trigger),它使我们不需要编写任何的程序代码就能在属性变化时执行自定义行为。下面是一个简单的属性触发器的例子:

<Trigger Property="IsMouseOver" Value="True">

       <Setter Property="Foreground" Value="Blue"/>

</Trigger>

它的功能就是在属性值IsMouseOver变为True的时,将属性Foreground的值设置为Blue。而且,它会在IsMouseOver变为False时自动将Foreground的值设置为原来的值。就是这样简单的三行代码完成了我们曾经需要多个函数、变量才能实现的功能。

属性值的继承将更加易于理解。我们在父元素中定义的某些元素的属性,同时将影响子元素对应的属性值。

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

FontStyle="Italic">

<Button>Hello<Button/>

</Window>

这里我们把WindowFontStyle属性设置为Italic,那么它将影响所有适用于这个属性的子元素。也就是说Button显示的文本也将是Italic风格的。

0
相关文章