前言
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/