為了讓你的應用程序更有個性,我們通常會在WP7開發過程中會自定義自己風格的控件,自定義控件中設置各種模板,綁定數據,修改控件行為,但是對于很多朋友來說,這么做是為什么? 不是很清楚,看MSDN的話,又一時找不到頭緒,本文就是從控件類庫的繼承關系里來剖析出自定義控件中的為什么?如果你覺得本文觀點獨特,對你有很大幫助,請頂之,謝謝。
一、 控件分類
讓我們先從我們熟悉的控件分類開始,因為這樣理解更直觀。
WP7里基本控件可以分為以下四類:
1.文本控件:主要用于顯示和輸入文本
2.內容控件:主要用于包含一個子控件元素UIElement(UIElement是所有可視UI控件的基類,我叫它第三代控件祖宗)
3.項集合控件:從名字可以知道,它是包含有多個子項的控件,如ListBox
4.容器控件:它可以包含有多個子控件元素(UIElement)
如下表所示,常用基本控件。
控件 | 控件類型 | 內容屬性 |
TextBlock | 文本控件 |
TextBlock.Text TextBlock.Inlines |
TextBox | 文本控件 | TextBox.Text |
PasswordBox | 文本控件 | PasswordBox.Password |
Button | 內容控件 | ContentControl.Content |
CheckBox | 內容控件 | ContentControl.Content |
RadioButton | 內容控件 | ContentControl.Content |
ListBoxItem | 內容控件 | ContentControl.Content |
ListBox | 項集合控件 |
ItemsControl.Items ItemsControl.ItemsSource |
Canvas | 容器控件 | Panel.Children |
Grid | 容器控件 | Panel.Children |
StackPanel | 容器控件 | Panel.Children |
二、主要控件基類
System.Windows.Controls命名空間下,包含以下幾個主要的控件基類:
? Control
? ContentControl
? ItemsControl
? Panel
1. Control:表示用戶界面控件的基類
主要屬性:
? Control.Template 屬性:
通過將ControlTemplate應用給Control.Template 屬性來定義其外觀。所有繼承自Control類的子類,都繼承Template屬性,也就意味著,你可以通過自定義ControlTemplate來實現Control子控件的自定義。 注意:它有一個子類UserControl,用于快速創建控件,不過,你不能自定義ControlTemplate,并將它應用于UserControl。
主要事件:
? GotFocus,LostFocus
當控件獲得或失去焦點時回調
MouseLeftButtonUp ,MouseMove ,MouseLeftButtonDown
當控件被點擊,移動時分別回調
ManipulationStarted ,ManipulationDelta, ManipulationCompleted
當用戶對控件開始進行操作時回調ManipulationStarted,當用戶對控件操作并更改位置時回調ManipulationDelta,當用戶對控件停止操作時,回調ManipulationCompleted。
SizeChanged
當代表控件大小的ActualHeight 或 ActualWidth屬性改變時回調
2. ContentControl:是其他內容控件的基類,表示包含單項元素的內容控件。像 Button、CheckBox 和 ScrollViewer 這樣的控件直接或間接繼承自該類。
主要屬性:
? ContentControl. Content 屬性:
ContentControl.Content 屬性可以是任何類型的對象,例如字符串、UIElement 或 DateTime。當ContentControl.Content 設置為 UIElement 時,ContentControl 中將顯示 UIElement。當ContentControl.Content 設置為其他類型的對象時,ContentControl 中將顯示該對象的字符串表示形式。
注意:ContentControl 具有有限的默認樣式。如果要增強該控件的外觀,可以創建新的 DataTemplate類型屬性用于自定義。
ContentControl. ContentTemplate屬性:
它是一個DataTemplate對象元素,定義該ContentControl的內容顯示外觀。
3. ItemsControl:是項集合類的基類。
主要屬性:
? Items屬性:
如果要顯示固定列表,則應當用一個或多個 FrameworkElement 子對象填充ItemsControl .Items屬性,并且不要指定ItemsSource。
? ItemsSource屬性:
如果要顯示對象數據源中的數據,則應將ItemsSource指定為對某個對象的引用。 通常,這可通過 Binding 聲明來實現,
? ItemsPanel屬性:
設置該屬性來自定義項集合控件的布局方式,是一個ItemsPanelTemplate類型元素。
? ItemTemplate屬性:
設置該屬性來指定項集合控件中,每一個Item項的數據顯示外觀,是一個DataTemplate類型元素。
4. Panel: 是容器控件的基類,比如:Canvas, Grid, StackPanel。
自定義布局行為可以通過以下方式來實現:從 Panel 繼承并使用 MeasureOverride 和 ArrangeOverride 方法重寫默認度量和排列行為。
上面解釋的基類中的主要屬性和方法是我們在自定義控件時去修改的東西,通過中間的繼承關系圖可以看得出,Panel類與Control類沒有任何繼承關系,這也就從祖宗這輩上決定了其孩子的特性不一樣,所以在對兩個大分支類進行自定義時不一樣,Panel類主要是包含其它控件的容器控件,對容器控件的主要自定義就是設置不同的被包含控件之間的布局,因此重載其兩個測量方法。而Contorl類是用戶交互類,有外觀,有交互操作,對其子類主要是自定義其外觀和操作,也就是說,通過設置其Template屬性和重載具體的事件來達到目的。
? ContentControl類是Control類的子類,它有Control的特點,不過,它是內容控件,主要用來包含一個UIElement。
? 既然包含一個UIElement,就要設置這個UIElement的內容,即:Content屬性。
? 通過ContentTempalte來定義這個被包含的UIElement的外觀,因此,如果要自定義外觀那就是重新創建新的DataTempalte,應用到ContentTempalte屬性嘍。
? ItemsControl類是Control類的子類,同樣繼承了該繼承的東西,它是個項集合類,可以包含多個子項Item。
? 它有Items屬性和ItemsSource讓用戶來指定包含哪些子項。
? 各子項之間要怎樣布局,就有了ItemtPanel屬性用來讓用戶指定。
? 每一個子項是一個內容控件,它具有ContentControl的特點,因此還要通過ItemTempalte屬性指定每一個項的外觀。