前言
Windows Phone为开发者提供了很多原生控件,但在很多场景下我们需要对默认的功能或样式做一定的修改才能满足我们的需求,自定义控件应运而生。本文通过以自定义控件进度环(ProgressRing)为例,向大家介绍Windows Phone中如何创建和使用自定义控件。
1、控件基类
通常自定义控件继承自Control、ItemsControl、ContentControl等。
Control:代表使用ControlTemplate来定义样式的UI控件的基类。
System.Object System.Windows.DependencyObject System.Windows.UIElement System.Windows.FrameworkElement System.Windows.Controls.Control
ItemsControl:代表一个可以用于表现一个集合对象的控件。
System.Object System.Windows.DependencyObject System.Windows.UIElement System.Windows.FrameworkElement System.Windows.Controls.Control System.Windows.Controls.ItemsControl
ContentControl:代表一个具有单独块级内容元素的控件。比如像Button,CheckBox,ScrollViewer都直接或间接的继承于它。
System.Object System.Windows.DependencyObject System.Windows.UIElement System.Windows.FrameworkElement System.Windows.Controls.Control System.Windows.Controls.ContentControl
2、创建自定义控件
下面我们就来创建一个继承自Control的用户控件ProgressRing的类。
namespace WindowsPhone.Controls { public class ProgressRing : Control { public ProgressRing() { DefaultStyleKey = typeof(ProgressRing); } public override void OnApplyTemplate() { base.OnApplyTemplate(); } public bool IsActive { get { return (bool)GetValue(IsActiveProperty); } set { SetValue(IsActiveProperty, value); } } public static readonly DependencyProperty IsActiveProperty = DependencyProperty.Register("IsActive", typeof(bool), typeof(ProgressRing), new PropertyMetadata(false, new PropertyChangedCallback(IsActiveChanged))); private static void IsActiveChanged(DependencyObject d, DependencyPropertyChangedEventArgs args) { var pr = (ProgressRing)d; var isActive = (bool)args.NewValue; } } }
通过DependencyProperty IsActiveProperty来代表进度环的状态,DependencyProperty和普通的属性的区别为,DependencyProperty属性可以为值表达式、数据绑定、动画和属性更改通知提供支持。举个例子,如果你声明了一个Style,你可以通过 <Setter Property="Background" Value="Red" /> 的形式来设置背景色,因为Background是DependencyProperty属性,但是你不能对一般的属性进行同样的操作,因为他们不是DependencyProperty属性。
DefaultStyleKey代表默认样式,若要为继承自 Control 的控件提供默认的 Style,请将 DefaultStyleKey 属性设置为相同类型的 TargetType 属性。 如果您没有设置 DefaultStyleKey,则将使用基类的默认样式。 例如,如果称为 NewButton 的控件继承自 Button,要使用新的默认 Style,请将 DefaultStyleKey 设置为类型 NewButton。 如果您没有设置 DefaultStyleKey,则会将 Style 用于 Button。
在一些复杂的场景中,比如你想要获取ControlTemplate中某个对象的实例,就有必要override OnApplyTemplate方法。这个方法在控件展示在屏幕前被调用,在这种场景下OnApplyTemplate比Loaded事件更适合来调整由template创建的visual tree,因为Loaded事件可能会在页面应用模板之前被调用,所以可能无法获取到ControlTemplate中的对象的实例,也就可能无法完成之前调整模板的功能。
查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索windows
, 控件
, 属性
, system
, controltemplate
, control
Controls
wpf progressring、windows phone、windowsphone、windows phone 10、windowsphone手机,以便于您获取更多的相关知识。