属性和事件是.NET抽象模型的核心部分,WPF在这之上增加了Dependency Property(依赖属性)。依赖属性使用更高效的保存机制,并且支持附加的功能,更改通知、属性值继承(在元素树中向下传播默认属性值)以及减少属性存储空间。依赖属性是WPF动画、数据绑定和样式的基础。通过封装,依赖属性和.NET属性的访问方式一致,但是其背后的实现方式是不一样的。
使用依赖属性的原因很简单,出于性能考虑,如果WPF设计者只是简单的在.NET属性系统之上添加额外的功能,那么就需要为编写代码创建一个复杂庞大的层次,如果不承受这一额外的负担,普通属性就不能支持依赖属性的所有功能。
什么时候使用依赖属性
当该属性可能会被绑定表达式、用于动画计算、更改通知、共享以及属性值继承时,应选择使用依赖属性。
限制
依赖属性所属类必须继承或间接继承自:System.Windows.DependencyObject类。
依赖属性语法
定义
public static readonly DependencyProperty XXXXProperty;
根据约定,依赖属性的字段的名称为普通属性名称的末尾加上单词"Property"。
初始化
XXXXProperty = DependencyProperty.Register(…);
属性包装器
public object XXXX
{
set{ this.SetValue(XXXXProperty,value);}
get{ return this.GetValue(XXXXProperty) as object;}
}
属性包装器不应当添加额外的验证属性值或引发事件的等等代码,这是因为WPF中的其它功能可能会忽略属性包装器,并直接调用SetValue()和GetValue()方法(例如:在运行时解析编译过的XAML文件)。
属性值验证:
DependencyProperty.ValidateValueCallback
可以接受或拒绝新值。
DependencyProperty.CoerceValueCallback
可以将新值修改为更能被接受的值。
事件触发:FrameworkPropertyMetadata.PropertyChangedCallback
执行顺序:
首先,CoerceValueCallback被调用。
接下来调用ValidateValueCallback。
如果上述两个方法都成功,调用PropertyChangedCallback。
依赖属性的值
依赖属性遵循严格的优先规则以确定当前值。即使没有直接设置依赖属性,它可能已经有了数值(可能由数据绑定、样式或者动画提供的,也可能是通过元素树继承来的)。但是,只要直接设置了属性值,设置的属性值就会覆盖所有其它的影响。
如果希望删除本地值设置,并让属性好像从来没有设置过那样确定其取值,可以使用DependencyObject.ClearValue()方法。
例如:element.ClearValue(FrameworkElement.MarginProperty);
共享依赖属性
一些类会共享同一个依赖属性,尽管这些类具有不同的继承层次。例如:TextBlock.FontFamily属性和Control.FontFamily属性指向同一个静态的依赖属性,该属性实际上是在TextElement类中定义的TextElement.FontFamilyProperty依赖属性。
例如:TextBlock.FontFamilyProperty = TextElement.FontFamilyProperty.AddOwner(typeof(TextBlock));
附加的依赖属性
附加属性是一种依赖属性,并且它由WPF属性系统管理。和依赖属性不同的是,附加属性被应用到一个非定义该属性的类。
例如:Grid类的Row和Column就是最常见的例子。
为了定义附加属性,需要使用DependencyProperty.RegisterAttached(…);
当创建附加属性时,不需要定义属性包装器,这是因为附加属性可以被用于任何依赖对象。附加属性需要调用两个静态方法来设置和获取属性的值,这两个方法应当命名为SetPropertyName()和GetPropertyName().
例如:
public static int GetRow(DependencyObject element)
{
return element.GetValue(Grid.RowProperty) as int;
}
public static void SetRow(DependencyObject element , int value)
{
element.SetValue(Grid.RowProperty , value);
}
分类: WPF
分享到:
相关推荐
依赖属性详解,有源码 //传入ownerType增加Owner public DependencyProperty AddOwner(Type ownerType) { return AddOwner (ownerType, null); } //增加所有者,根据ownerType和typeMetadata public ...
**WPF依赖项属性详解与示例** 在Windows Presentation Foundation(WPF)中,依赖项属性(Dependency Property)是框架的核心特性之一,它为UI元素提供了数据绑定、样式设定、动画支持以及事件处理等强大功能。依赖...
**WPF 依赖属性与附加属性详解** 在Windows Presentation Foundation(WPF)中,依赖属性(Dependency Property)和附加属性(Attached Property)是两个核心概念,它们为数据绑定、属性继承以及自定义控件提供了...
它引入了全新的窗口系统,称为“依赖属性”和数据绑定,使得UI与业务逻辑的解耦更为容易。此外,WPF还支持矢量图形,这意味着UI元素可以在不同分辨率下保持清晰。 二、控件基础 在WPF中,控件是构建用户界面的基本...
课程中使用构造函数、属性、方法注入等方式,实现依赖注入。 本资源为WPF五子棋军师开发详解的第一部分,涵盖了WPF项目实战、机器视觉、人工智能、MVVM框架和P/Invoke等方面的内容,为开发者提供了一个系统的学习...
### WPF控件详解 #### 4.1 内容控件 内容控件是一类简单控件,它们仅允许包含单一的项(item)。这类控件继承自`System.Windows.Controls.ContentControl`类,其中最关键的一个属性是`Content`,这是一个`Object`...
首先,我们需要理解WPF的基础,包括控件模板、数据绑定、依赖属性和事件处理。WPF提供了一个强大的框架,允许我们通过XAML来描述UI,并通过C#或VB.NET等后台代码处理业务逻辑。 1. **自定义控件的创建**: - 首先...
同时,依赖属性(Dependency Property)是WPF提供的一种特殊属性类型,它支持数据绑定、属性变更通知以及跨线程安全的属性更改。 **6. 实现MVVM的工具和技术** 在实际项目中,开发者通常会使用一些库和框架来简化...
依赖属性是WPF中的特殊属性,它们支持数据绑定、动画和属性更改通知。属性元数据定义了依赖属性的默认值、验证规则和更改回调。 8. **MVVM模式** Model-View-ViewModel (MVVM) 是一种推荐的WPF应用程序架构。...
在“MVVM入门与提高_Source”这个压缩包中,很可能包含了一系列的WPF项目源码,这些示例可能涵盖了从基础的MVVM应用到更复杂的场景,如数据绑定、命令实现、依赖属性的使用、模板数据上下文的传递、以及如何利用IoC...
依赖属性(DependencyProperty)是WPF的核心特性之一,它们的值可以被缓存,从而提高性能。当属性值改变时,WPF会自动处理依赖关系的更新,减少了不必要的计算。 ### 六、使用CacheMode优化渲染 `CacheMode`属性...
**WPF技术详解** WPF(Windows Presentation Foundation)是微软.NET Framework的一部分,它提供了一种强大的、基于XAML的框架来构建丰富的、交互式的桌面应用程序。这个标题和描述提到的"非常精美界面"和"漂亮首页...
2. **依赖属性(Dependency Property)**:WPF中的大多数UI元素属性都是依赖属性,这使得它们可以支持数据绑定。依赖属性具有通知机制,当其值发生变化时,可以触发相关的回调,更新UI。 3. **数据模板...
4. **依赖属性追踪**:WPF中的依赖属性具有值更改通知机制,Snoop可以帮助开发者跟踪这些变化,理解属性之间的相互影响。 5. **数据绑定检查**:Snoop可以展示数据绑定的源和目标,帮助开发者排查数据绑定问题。 6...
1.WPF绑定使用的源属性必须是依赖项属性,这是因为依赖项属性具有内置的更改通知支持,元素绑定表达式使用了Xaml扩展标记,WPF绑定一个控件是使用Binding.ElementName,绑定非控件对象时使用Source,RelativeSource,...
依赖属性则是WPF中属性系统的核心,支持数据绑定和动画,使得属性的更改可以被监听和响应。 6. **命令**: 命令模式在WPF中被广泛使用,如ICommand接口,它封装了执行业务逻辑的行为,将UI操作与实际操作分离,提高...
8. **依赖属性**:依赖属性是WPF中的一个重要概念,它允许控件的属性与其他对象的状态相互关联,方便了数据绑定和事件处理。 9. **事件处理**:WPF事件处理机制支持事件委托和事件路由,使得事件处理更加灵活。 10...
3. **属性(Property)**:目标对象上的依赖属性,依赖属性是WPF中特殊类型的属性,支持数据绑定和动画等功能。 4. **目标(Target)**:依赖对象,通常是WPF UI元素,如TextBlock或TextBox,它的属性将被绑定到源...