Wpf依赖属性

摘要:
由WPF属性系统支持的属性称为依赖项属性。依赖项属性提供用来扩展属性功能的功能,最常用的莫过于“数据绑定”功能,依赖项属性可以通过数据绑定来引用值。依赖项属性只能由继承自DependencyObject类的类型使用,但DependencyObject在WPF类层次结构中的级别很高,因此,WPF中的大多数可用类都支持依赖项属性。
本博文参考:http://www.cnblogs.com/xiongpq/archive/2010/06/29/1767905.html 概述:

Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能。这些服务通常统称为 WPF 属性系统。由 WPF 属性系统支持的属性称为依赖项属性。

依赖项属性提供用来扩展属性功能的功能, 最常用的莫过于“数据绑定”功能,依赖项属性可以通过数据绑定来引用值。数据绑定通过特定的标记扩展语法(在 XAML 中)或 Binding 对象(在代码中)来工作。使用数据绑定,最终属性值的确定将延迟到运行时,在运行时,将从数据源获取属性值,并可实现动态更新。

本文目的:

介绍依赖属性应用场景,及自定义依赖属性方法。

正文:

什么是依赖属性

依赖属性可支持WPF中的样式设置、数据绑定、继承、动画及默认值。依赖项属性是通过调用 Register 方法(或 RegisterReadOnly)在 WPF 属性系统中注册,并通过 DependencyProperty 标识符标示属性。 依赖项属性只能由继承自 DependencyObject 类的类型使用,但 DependencyObject 在 WPF 类层次结构中的级别很高,因此,WPF 中的大多数可用类都支持依赖项属性。

何时应实现依赖项属性

将所有的属性都设置为依赖属性并不总是正确的解决方案,具体取决于其应用场景。有时,使用私有字段实现属性的典型方法便能满足要求。MSDN中给出了下面几种应用依赖属性的场景:

1. 希望可在样式中设置属性。

2. 希望属性支持数据绑定。

3. 希望可使用动态资源引用设置属性。

4. 希望从元素树中的父元素自动继承属性值。

5. 希望属性可进行动画处理。

6. 希望属性系统在属性系统、环境或用户执行的操作或者读取并使用样式更改了属性以前的值时报告。

7. 希望使用已建立的、WPF 进程也使用的元数据约定,例如报告更改属性值时是否要求布局系统重新编写元素的可视化对象。

目前我使用最多的场景是前三条,下面是一个典型的依赖属性在数据绑定上的应用场景:

界面上有A、B两个图片,大小一样,我们需要在改变图片A大小的时候,同时也改变图片B的大小,让他们的大小总保持一致。按照通常的做法我们应该怎么做?

我们需要在图片A的SizeChanged事件中添加处理图片B的方法。把图片A的Size赋给图片B。这么一个简单的功能需要这么一段代码来做是不是有点繁琐,若此类需求更多,则你需要处理的事件将更多。

然而使用依赖属性,可以用下面三句话实现此功能:

imageB.DataContext = imageA;
imageB.SetBinding(Image.WidthProperty, "Width");
imageB.SetBinding(Image.HeightProperty, "Height");

怎么样,够简洁吧!这段话大致的意思就是:

1. 将ImageB的参与数据绑定时的数据上下文为ImageA,即ImageB上绑定的数据都到ImageA上找;

2. 将ImageB的宽高通过SetBinding的方法绑定到"Width"及"Height"两个属性上。这两个属性的值在哪里找,就在ImageB的DataContext中找,在这里就是ImageA的"Width"及"Height"。

这样就将ImageA和ImageB的"Width"及"Height"绑定在一起,其中一个图片的"Width"及"Height"发生改变时,另一个图片的Size也会相应的发生改变。

如何自定义依赖属性

在类上实现属性时,只要该类派生自 DependencyObject,便可以选择使用 DependencyProperty 标识符来标示属性,从而将其设置为依赖属性。其语法如下:

public static DependencyProperty TextProperty =
       DependencyProperty.Register("Text", //属性名称
       typeof(string), //属性类型
       typeof(TestDependencyPropertyWindow), //该属性所有者,即将该属性注册到那个类上
       new PropertyMetadata("")); //属性默认值
        
public string Text
{
   get { return (string)GetValue(TextProperty); }
   set { SetValue(TextProperty, value); }
}

可以看到其与普通属性的主要区别在于:

1. 字段必须为static,且类型为DependencyProperty,字段名需遵守命名约定,即后缀为Property;

2. 字段的修饰符须设置为Public,否则在外部不能通过SetBinding方法,绑定此属性的值;

3. 字段的值通过DependencyProperty.Register来设置,各参数的说明详见代码中的说明;

4. 设置属性值时,通过SetValue、GetValue而不是Set、Get。

通过上面的方法我们便在CustomSape类上自定义了一个依赖属性“Text”,然后我们便可以像使用系统自带的依赖属性一样,使用这个属性。

总之,依赖属性是WPF的一个重要特性,可以用简单的几句话,实现原来Winform实现起来非常繁琐的功能。具体什么时候使用依赖属性、什么时候使用普通属性,就要看具体的使用情况,并参照MSDN给出的7个应用场景。

免责声明:文章转载自《Wpf依赖属性》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇OpenLDAP安装与配置TVM 各个模块总体架构下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF实现TextBox水印效果

通常情况下,在使用文本框的时候,一般会在文本框上放一段水印文字,今天用WPF来实现一下 创建一个用户控件 一般像这种常用的,最好是自己写成用户控件,防止复制粘贴大量冗余代码 XAML: <TextBox x: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/prese...

项目笔记---WPF之Metro风格UI

写在前面   作为新年开篇的文章,当然要选择比较“Cool”的东西来分享,这自然落到了WPF身上,WPF技术自身可塑性非常强,其强大的绘图技术以及XAML技术比WinForm而言有本质的飞跃。   切入正题,本文来自于一个项目的Demo演示版,当然为了做到“Cool”我选择了WPF作为项目的概念版进行演示,所用到包括大名鼎鼎的MahApps.Metro以及...

WPF 下两种图片合成或加水印的方式

最近项目中应用多次应用了图片合成,为了今后方便特此记下。 在WPF下有两种图片合成的方式,一种还是用原来C#提供的GDI+方式,命名空间是System.Drawing 和 System.Drawing.Imaging,另一种是WPF中新添加的API,命名空间是 System.Windows.Media 和 System.Windows.Media.Imag...

WPF入门-使用C#创建简单应用

本文,你将熟悉在使用VS2019开发应用程序时可使用的许多工具、对话框和设计器。将创建一个“Hello World”应用程序、UI设计器、添加代码并调试错误。 先决条件: 安装Visual Studio 2019(16.3或者更高版本)。本文环境是16.8 一、创建项目   1、打开VS2019,   2、在‘开始’窗口,选择‘创建新项目’:      3...

[转]WPF焦点概述

WPF 中,有两个与焦点有关的主要概念:键盘焦点和逻辑焦点。 键盘焦点指接收键盘输入的元素,而逻辑焦点指焦点范围中具有焦点的元素。 本概述将详细介绍这些概念。 理解这些概念之间的区别对于创建具有可以获取焦点的多个区域的复杂应用程序是非常重要的。 参与焦点管理的主要类有 Keyboard 类、FocusManager 类以及基元素类(如 UIElement...

WPF: 在ListView中添加Checkbox列表

描述:ListView是WPF中动态绑定工具的数据容器,本文实现了一个在ListView中显示的供用户选择的列表项目,并且控制列表中选择的项目数量,即实现单选。 XAML中创建ListView,代码如下: <ListView x:Name="listView_LineOfBusiness" Width="280" Height="220">...