Windows 8 Store Apps学习(16) 控件基础: 依赖属性等等2013-12-04 cnblogs webabcd控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试介绍重新想象 Windows 8 Store Apps 之 控件基础DependencyProperty - 依赖属性AttachedProperty - 附加属性控件的继承关系路由事件和命中测试示例1、开发一个具有 DependencyProperty 和 AttachedProperty 的自定义控件MyControls/themes/generic.xaml
<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:MyControls"><!--自定义控件的样式在本文件(themes/generic.xaml)中定义整合外部 ResourceDictionary--><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="ms-appx:///MyControls/themes/MyControl.xaml"/></ResourceDictionary.MergedDictionaries> </ResourceDictionary>
MyControls/themes/MyControl.xaml
<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:MyControls"><Style TargetType="local:MyControl"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="local:MyControl"><Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"><StackPanel><!--绑定自定义依赖属性--><TextBlock Text="{TemplateBinding Title}" Foreground="White" FontSize="26.667" /><!--绑定自定义附加属性--><TextBlock Text="{TemplateBinding local:MyAttachedProperty.SubTitle}" Foreground="White" FontSize="14.667" /></StackPanel></Border></ControlTemplate></Setter.Value></Setter></Style></ResourceDictionary>
MyControls/MyControl.cs
/* * 开发一个自定义控件,用于演示依赖属性(Dependency Property)和附加属性(Attached Property) ** 依赖属性:可以用于样式, 模板, 绑定, 动画 * 附加属性:全局可用的依赖属性 */using Windows.UI.Xaml.Controls;using Windows.UI.Xaml;namespace MyControls{/// <summary>/// 用于依赖属性的演示/// </summary>public class MyControl : Control{public MyControl(){// 指定默认样式为 typeof(MyControl),即对应:<Style xmlns:local="using:MyControls" TargetType="local:MyControl" />this.DefaultStyleKey = typeof(MyControl);}// 通过 DependencyObject.GetValue() 和 DependencyObject.SetValue() 访问依赖属性,这里由 Title 属性封装一下,以方便对依赖属性的访问public string Title{get { return (string)GetValue(TitleProperty); }set { SetValue(TitleProperty, value); }}// 注册一个依赖属性public static readonly DependencyProperty TitleProperty =DependencyProperty.Register("Title", // 依赖属性的名称typeof(string),// 依赖属性的数据类型typeof(MyControl),// 依赖属性所属的类new PropertyMetadata("", PropertyMetadataCallback)); // 指定依赖属性的默认值,以及值发生改变时所调用的方法private static void PropertyMetadataCallback(DependencyObject sender, DependencyPropertyChangedEventArgs args){object newValue = args.NewValue; // 发生改变之后的值object oldValue = args.OldValue; // 发生改变之前的值}}/// <summary>/// 用于附加属性的演示/// </summary>public class MyAttachedProperty{// 获取附加属性public static string GetSubTitle(DependencyObject obj){return (string)obj.GetValue(SubTitleProperty);}// 设置附加属性public static void SetSubTitle(DependencyObject obj, string value){obj.SetValue(SubTitleProperty, value);}// 注册一个附加属性public static readonly DependencyProperty SubTitleProperty =DependencyProperty.RegisterAttached("SubTitle", // 附加属性的名称typeof(string), // 附加属性的数据类型typeof(MyAttachedProperty), // 附加属性所属的类new PropertyMetadata("", PropertyMetadataCallback)); // 指定附加属性的默认值,以及值发生改变时所调用的方法private static void PropertyMetadataCallback(DependencyObject sender, DependencyPropertyChangedEventArgs args){object newValue = args.NewValue; // 发生改变之后的值object oldValue = args.OldValue; // 发生改变之前的值}}}