WPF系列 —— 控件添加依赖属性(转)
WPF系列 —— 控件添加依赖属性
依赖属性的概念,用途 ,如何新建与使用。本文用做一个自定义TimePicker控件来演示WPF的依赖属性的简单应用。
先上TimePicker的一个效果图。

概念 和 用途:依赖属性是对传统.net 属性的一种封装,使一个传统.net属性支持 WPF 中的 数据绑定、动画、样式 等功能。
新建:任意代码代码文件中 ,输入 propdp 再双击tab键。生成如下的代码块。
MyProperty: 依赖属性的名称; ownerclass: 当前依赖属性绑定的所有类; new PropertyMetadata 是依赖属性的初始化对象,这里0代表默认值。

public int MyProperty
{
get { return (int)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
} // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));

使用:这里我们使用绑定绑定,稍后使用自定义控件的Time属性来介绍。
如何使用依赖属性构建一个带绑定的TimePicker自定义控件
新建一个项目名称为DependencyPropertyDemo的WPF 项目
,新建一个TimePicker的自定义控件。Xaml布局如下:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="9*"/>
<ColumnDefinition Width="24"/>
<ColumnDefinition Width="10*"/>
</Grid.ColumnDefinitions>
<ComboBox Name="cbbHour" Grid.Column="0"/>
<Label Content=":" Grid.Column="1"/>
<ComboBox Name="cbbMinute" Grid.Column="2"/>
</Grid>

BehindCode新建一个名称为Time的依赖属性,如下:

public string Time
{
get { return (string)GetValue(TimeProperty); }
set { SetValue(TimeProperty, value); }
} public static readonly DependencyProperty TimeProperty =
DependencyProperty.Register("Time",
typeof(string),
typeof(TimePicker),
new PropertyMetadata(defaultValue: "00:00",
propertyChangedCallback: null,
coerceValueCallback: coerceValueCallback)); private static object coerceValueCallback(DependencyObject d, object baseValue)
{
if (baseValue != null)
{
var control = d as TimePicker;
var times = baseValue.ToString().Split(':');
control.cbbHour.SelectedItem = times[0];
control.cbbMinute.SelectedItem = times[1];
return baseValue.ToString();
}
return baseValue;
}

这里详细介绍一下PropertyMetadata的三个参数:defaultValue:默认值,不用介绍了;propertyChangedCallback:属性变化后的通知事件,这里不需要任何通知,所以传入null值;coerceValueCallback:这是属性值新值绑定时,通知事件,这里使用得到的值来给控件赋值。到这里Time依赖属性也就完成一半了。
TimePicker属性依赖属性Time的绑定
绑定方式很简单,如下图。若Time是一个普通的.net属性而非依赖属性的话,是不能这样使用绑定方式的。
<local:TimePicker HorizontalAlignment="Left" Margin="137,38,0,0" VerticalAlignment="Top" Width="161"
Time="{Binding StartTime,Mode=TwoWay}"/>
假设添加在TimePicker后台添加一个Code的普通属性,使用绑定的话,会出现如下的状况。

后话总结
依赖属性使用是有一定限制的,就是他注册的类对象,也就是上文的ownerclass必须继承DependencyObject 这个基类,不过不用担心,WPF大部分元素都间接的集成这个基类。
本文实现的TimePicker控件可以在一些情况下解决WPF下没有Time选择控件的问题。
如果,您认为阅读这篇博客让您有些收获,请点击下面的【推荐】和 【关注】按钮,感谢大家的支持,我是朝兮兮。
WPF系列 —— 控件添加依赖属性(转)的更多相关文章
- WPF系列 —— 控件添加依赖属性
依赖属性的概念,用途 ,如何新建与使用.本文用做一个自定义TimePicker控件来演示WPF的依赖属性的简单应用. 先上TimePicker的一个效果图. 概念 和 用途:依赖属性是对传统.net ...
- 如何给ActiveX控件添加“事件”“属性”“标准事件”“自定义事件”等一些相关操作
上一篇小编带大家熟悉了一下ActiveX的建立以及相关的概念,(http://blog.csdn.net/u014028070/article/details/38424611) 本文介绍下如何给控件 ...
- 重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试
原文:重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试 [源码下载] 重新想象 Windows 8 Store ...
- 【C#】使用IExtenderProvider为控件添加扩展属性,像ToolTip那样
申明: - 本文适用于WinForm开发 - 文中的“控件”一词是广义上的说法,泛指包括ToolStripItem.MenuItem在内单个界面元素,并不特指继承自Control类的狭义控件 用过To ...
- ATL向控件添加私有属性-成员变量
https://msdn.microsoft.com/zh-cn/library/cc451389(v=vs.71).aspx ------------------------------------ ...
- WPF RichTextBox 控件常用方法和属性
以下内容转自 http://blog.csdn.net/yulongguiziyao/article/details/25330551. 1. 取得已被选中的内容: (1)使用 RichTextBox ...
- WPF Image控件的Source属性是一个ImageSource对象
1.固定的图片路径是可以的,如下: <Image Source="../test.png" /> 2.绑定的Path是一个String类型的图片路径,而实际情况它需要的 ...
- WPF对某控件添加右键属性
代码创建右键属性 ContextMenu cm = new ContextMenu(); MenuItem mi = new MenuItem(); mi.Header = "打开此文件所有 ...
- WPF 用户控件的自定义依赖属性在 MVVM 模式下的使用备忘
依赖属性相当于扩充了 WPF 标签的原有属性列表,并可以使用 WPF 的绑定功能,可谓是十分方便的:用户控件则相当于代码重用的一种方式:以上几点分开来还是比较好理解的,不过要用到MVVM 模式中,还是 ...
随机推荐
- [LeetCode] 146. LRU Cache 最近最少使用页面置换缓存器
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- [LeetCode] 8. String to Integer (atoi) 字符串转为整数
Implement atoi which converts a string to an integer. The function first discards as many whitespace ...
- 拒绝后门程序-Alibabaprotect和AliPaladin
详细参考帖子及评论区:流氓进程AlibabaProtect的删除[程序员吧]_百度贴吧 首先打开服务找到AlibabaProtect,然后找到他的位置(C:\Program Files (x86)\A ...
- 雅礼集训 2017 Day4 编码(2-sat)
题意 题目链接:https://loj.ac/problem/6036 思路 首先,有前缀关系的串不能同时存在,不难看出这是一个 2-sat 问题.先假设所有串都带问号,那么每一个字符串,我们可以 ...
- idea找不到tomcat,找不到Tomcat server
打开settings 添加即可 如果再没有,可能需要先安装timcat插件
- 微信企业号消息接口PHP SDK
微信企业号消息接口PHP SDK及Demo <?php /* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved * ...
- 1+x证书《Web前端开发》等级考试样题
Web前端开发初级理论考试样题2019 http://blog.zh66.club/index.php/archives/149/ Web前端开发初级实操考试样题2019 http://blog.zh ...
- 配置ssl使用了不受支持的协议。 ERR_SSL_VERSION_OR_CIPHER_MISMATCH
使用了不受支持的协议. ERR_SSL_VERSION_OR_CIPHER_MISMATCH 协议不受支持 客户端和服务器不支持一般 SSL 协议版本或加密套件. 类似的这种提示 免费版百度云 ...
- laravel 一些好用的GitHub项目包
链接地址:好用的GitHub包
- 有关Oracle 查询时间的记录 (1)
目录 写在前面 一.年.月.日.季.周 二.EXTRACT 年.月.日 三.上个星期一到星期天 四.1分钟前.1小时前.1月前.1年前 五.当月.上月.当天.前天 写在前面 在使用Oracle数据开发 ...