控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试
介绍
重新想象 Windows 8 Store Apps 之 控件基础
DependencyProperty - 依赖属性
AttachedProperty - 附加属性
控件的继承关系
路由事件和命中测试
示例
1、开发一个具有 DependencyProperty 和 AttachedProperty 的自定义控件
MyControls/themes/generic.xaml
<ResourceDictionary xmlns="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
<ResourceDiction ary xmlns="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; // 发生改变之前的值 } } }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 控件
, static
, 依赖
, 属性
, public
, 附加属性
, 依赖属性
, 基础属性
附加
,以便于您获取更多的相关知识。