WPF: 只读依赖属性的介绍与实践
在设计与开发 WPF 自定义控件时,我们常常为会控件添加一些依赖属性以便于绑定或动画等。事实上,除了能够添加正常的依赖属性外,我们还可以为控件添加只读依赖属性(以下统称“只读属性”),以增加控件的灵活性。
这听起来有些矛盾。只读依赖属性,只能读不能写,却又怎么能提高控件的灵活性呢?想想我们常用的 IsMouseOver 等属性就可以理解,它们都是只读属性,但如果没有它们,想要控制样式将比较复杂。
所以,总结来说,只读属性的特点是:无法赋值,不能绑定,不能用于动画,不能验证等;而之所以使用它,主要目的是结合属性触发器 (Trigger) 来实现样式的切换。
实践
比如,我们要创建一个 FilePicker 控件,用户通过它可以选择文件。那么,它至少包括一个 TextBlock(或 TextBox)和一个 Button,分别用于显示选择文件的路径和打开对话框。
现在我们想实现当用户选择了文件后,控件呈现某种样式。要这么做,我们就可以增加一个 IsFilePicked 只读属性,然后在 ControlTemplate 中添加 Trigger 来控制样式的变化。
1. 创建(定义与注册)
创建只读属性与创建普通依赖属性一样,包括定义、注册、与 CLR 属性包装这三步。不同的是要使用 DependencyProperty 的 RegisterReadOnly 方法来注册,这个方法会返回 DependencyPropertyKey 对象,它包含了对应只读属性的标识符,也就是与它关联的只读属性(通过 DependencyProperty 属性获得),并且对只读属性赋值也是通过它(注意:只读属性自身无法被赋值),代码如下:
// 只读属性的定义与注册
private static DependencyPropertyKey IsFilePickedPropertyKey = DependencyProperty.RegisterReadOnly("IsFilePicked", typeof(bool), typeof(FilePicker), new PropertyMetadata(false)); public static DependencyProperty IsFilePickedProperty = IsFilePickedPropertyKey.DependencyProperty;
注意其中的命名,因为我们要创建的属性是 IsFilePicked,所以上面两个变量都是在这个名称后加了后辍,分别是 PropertyKey 和 Property,这是命名规范。
另外,我们在元数据的实例中给这个只读属性设置默认值为 false。
2. 包装
然后,将它以 CLR 属性的方式来包装,由于这是个只读属性,所以只需要 get 段就可以,代码如下:
// 只读属性的包装
public bool IsFilePicked
{
get { return (bool)GetValue(IsFilePickedProperty); }
}
3. 通过 DependencyPropertyKey 赋值
在合适的位置(当用户选择过文件后),使用 SetValue 方法来赋值,SetValue 有两个重载,要为只读属性赋值,需使用第二个 SetValue(DependencyPropertyKey key, object value) ,代码如下:
SetValue(IsFilePickedPropertyKey, true);
4. 应用
逻辑写好后,在模板中增加以下 XAML 代码,即可:
<ControlTemplate.Triggers>
<Trigger Property="IsFilePicked" Value="True">
<!--显示绿色边框-->
<Setter Property="BorderBrush" Value="Green" />
<Setter Property="BorderThickness" Value="2" />
</Trigger>
</ControlTemplate.Triggers>
总结
本文简单介绍了在 WPF 中如何创建以及使用只读依赖属性,合适地使用它,能够使我们更灵活地实现对自定义控件样式的控制。
WPF: 只读依赖属性的介绍与实践的更多相关文章
- WPF的依赖属性
Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR)属性的功能,这些服务通常统称为 WPF 属性系统.由 WPF 属 ...
- WPF的依赖属性和附加属性(用法解释较全)
转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己 ...
- WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性
原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...
- wpf 的依赖属性只能在loaded 事件之后才能取到
wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的 InitializeComponent(); 之后取不到 wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的 ...
- WPF 中依赖属性的继承(Inherits)
WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点.例如,数据绑定中经常使用的DataContextProperty: var host ...
- WPF利用依赖属性和命令编写自定义控件
以实例讲解(大部分讲解在代码中) 1,新建一个WPF项目,添加一个用户控件之后在用户控件里面添加几个控件用作测试, <UserControl x:Class="SelfControlD ...
- WPF之依赖属性和附加属性
参考资料: 一站式WPF--依赖属性(DependencyProperty)一 一站式WPF--依赖属性(DependencyProperty)二 依赖属性之我见: 这两篇文章介绍的 ...
- WPF 自定义依赖属性
原博客地址:http://www.cnblogs.com/DebugLZQ/archive/2012/11/30/2796021.html DependencyObject和Dependen ...
- [转]WPF的依赖属性是怎么节约内存的
WPF升级了CLR的属性系统,加入了依赖属性和附加属性.依赖属性的使用有很多好处,其中有两点是我认为最为亮眼的: 1)节省内存的开销; 2)属性值可以通过Binding依赖于其它对象上,这就使得我的数 ...
随机推荐
- BZOJ:4873: [Shoi2017]寿司餐厅
4873: [Shoi2017]寿司餐厅 首先很开心在膜你赛的时候做了出来. 看到数据范围,看到不能dp,看到贡献去重后计算,咦,流? 那就容易了,转最大权闭合子图,每个区间建一个点,取了就一定要取他 ...
- Oracle_rowid_rownum分页
Oracle_rowid_rownum_分页 --rowid select * from account where rowid='AAASR6AAEAAAAJWAAA'; selec ...
- 10年java过来人聊聊自己的自学、培训和工作经历
一 . 自我介绍 我叫王涛,我是一位北漂十年的码农,2008年9月份开始自学java,三个月后,自学无果,于2008年11月份开始参加培训,培训完之后,我觉得自己还是啥也不会,只会抄抄代码,竟然连de ...
- Linux apache的运行用户和用户组
我们在安装apache后,有时在上传文件的时候,提示没有权限或者是不可写,我们都会去查文件夹的权限. 通过ls -l /var/www/html/website可以很直观的看出我们文件和文件夹的权限, ...
- Asp.net mvc 中的路由
在 Asp.net mvc 中,来自客户端的请求总是针对某个 Controller 中的 Action 方法,因此,必须采用某种机制从请求的 URl 中解析出对应的 Controller 和 Acti ...
- ADO.NET复习总结(5)--工具类SqlHelper 实现登录
工具类SqlHelper 即:完成常用数据库操作的代码封装 一.基础知识1.每次进行操作时,不变的代码: (1)连接字符串:(2)往集合存值:(3)创建连接对象.命令对象:(4)打开连接:(5)执行命 ...
- NSMutableArray 记住取不到时要进行强转
NSMutableArray 记住取不到时要进行强转
- 用程序读取CSV文件的方法
CSV全称 Comma Separated values,是一种用来存储数据的纯文本文件格式,通常用于电子表格或数据库软件.用Excel或者Numbers都可以导出CSV格式的数据. CSV文件的规则 ...
- 【开发技术】Xcode3与xcode4.2模板对比(Xcode4.2开发之一些变化)
Xcode3中IOS下的Application的模板如下: Navigation_Based Application OpenGL ES Application Tab Bar Application ...
- JavaScript高级编程小结
Undefined 对未初始化的变量执行typeof操作符会返回undefined值,而对未声明的变量执行typeof操作符同样也会返回undefined var message; console.l ...