先上TimePicker的一个效果图。html
概念 和 用途:依赖属性是对传统.net 属性的一种封装,使一个传统.net属性支持 WPF 中的 数据绑定、动画、样式 等功能。布局
新建:任意代码代码文件中 ,输入 propdp 再双击tab键。生成以下的代码块。post
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属性来介绍。url
新建一个项目名称为DependencyPropertyDemo的WPF 项目 ,新建一个TimePicker的自定义控件。Xaml布局以下:spa
<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的依赖属性,以下:.net
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依赖属性也就完成一半了。code
绑定方式很简单,以下图。若Time是一个普通的.net属性而非依赖属性的话,是不能这样使用绑定方式的。htm
<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选择控件的问题。
若是,您认为阅读这篇博客让您有些收获,请点击下面的【推荐】和 【关注】按钮,感谢你们的支持,我是朝兮兮。