WPF最常用的两种属性就属 依赖属性和附加属性。
一、依赖属性:依赖属性就是一种自己可以没有值,并且可以通过绑定从其他数据源获取值。依赖属性可支持WPF中的样式设置、数据绑定、继承、动画及默认值。
将所有的属性都设置为依赖属性并不总是正确的解决方案,具体取决于其应用场景。有时,使用私有字段实现属性的典型方法便能满足要求。
应用依赖属性的场景:
1.可在样式中设置属性。
2.支持数据绑定。
3.可使用动态资源引用设置属性。
4. 可从元素树中的父元素自动继承属性值。
5.可进行动画处理。
6.属性系统在属性系统、环境或用户执行的操作或者读取并使用样式更改了属性以前的值时报告。
7.可使用已建立的、WPF 进程也使用的元数据约定,例如报告更改属性值时是否要求布局系统重新编写元素的可视化对象。
依赖属性的特点:
1、属性变更通知:只要依赖属性的值发生改变,wpf就会自动根据属性的元数据触发一系列的动作,这些动作可以重新呈现UI元素,也可以更新当前的布局,刷新数据绑定等等
2、属性值继承:属性值自顶向下沿着元素树进行传递。
3、节省内存空间:依赖属性和CLR属性在内存的使用上是截然不同的,每个CLR属性都包含一个非static的字段,因此当我们实例化一个类型的时候,就会创建该类型所拥有的所有CLR属性,也就是说一个对象所占用的内存在调用new操作进行实例化的时候就已经决定了、而wpf允许对象在创建的时候并不包含用于存储数据的空间,只保留在需要用到数据的时候能够获得该默认值,即用其他对象数据或者实时分配空间的能力。
自定义依赖属性:
1、声明依赖属性变量。依赖属性的声明都是通过public static来公开一个静态变量,变量的类型必须是DependencyProperty
2、在属性系统中进行注册。使用DependencyProperty.Register方法来注册依赖属性,或者是使用DependencyProperty.RegisterReadOnly方法来注册
3、使用.NET属性包装依赖属性
<Grid >
<Button Height="50" Width="80">按钮
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Foreground" Value="Yellow"/>
<Setter Property="FontSize" Value="20"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>
二、附加属性:附加属性作用于支持附加属性的元素,它是由支持附加属性的父元素产出作业,支持附加属性的元素会继承所在的父元素的属性。
附加属性的特点:
1、特殊的依赖属性
2、用于非定义该属性的类 例如Grid面板的RowDefinition、ColumnDefinition、Canvas面板的Left、Right
DockPanel面板的Dock都是附加属性。
附加属性的定义:
1、声明数据属性变量。 public static 的DependencyProperty类型的变量。
2、在属性系统中进行注册,使用DependencyProperty.RegisterAttached()方法来注册,方法参数和注册依赖属性时Register()方法的参数一致。
3、调用静态方法设置和获取属性值。通过调用DependencyObject的SetValue()和GetValue()方法来设置和获取属性的值。
两个方法应该命名为SetPropertyName()方法和GetPropertyName()方法。
<Canvas>
<Rectangle Canvas.Left="20" Canvas.Top="5" Width="50" Height="100" RadiusX="10" RadiusY="10" Fill="Red">
</Rectangle>
<Rectangle Canvas.Left="70" Canvas.Top="10" Width="50" Height="100" RadiusX="10" RadiusY="10" Fill="Orange">
</Rectangle>
<Rectangle Canvas.Left="121" Canvas.Top="15" Width="50" Height="100" RadiusX="10" RadiusY="10" Fill="Yellow">
</Rectangle>
</Canvas>