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