WindowsPhone自定義控件(jian)(jian)詳(xiang)解(一) - 控件(jian)(jian)類(lei)庫分(fen)析
							時間:2014-11-27      來源:未知 
							為(wei)了(le)讓你(ni)的(de)應用程(cheng)序更有個性,我們通常會在(zai)WP7開發(fa)過程(cheng)中會自(zi)定義自(zi)己風格(ge)的(de)控件(jian),自(zi)定義控件(jian)中設置(zhi)各種模板,綁(bang)定數據(ju),修改控件(jian)行為(wei),但是(shi)對(dui)于很(hen)(hen)多朋友來(lai)說(shuo),這(zhe)么做(zuo)是(shi)為(wei)什么? 不(bu)是(shi)很(hen)(hen)清楚,看MSDN的(de)話,又一時找(zhao)不(bu)到(dao)頭緒,本文就是(shi)從控件(jian)類庫(ku)的(de)繼承關(guan)系里來(lai)剖析(xi)出(chu)自(zi)定義控件(jian)中的(de)為(wei)什么?如果(guo)你(ni)覺得本文觀點(dian)獨(du)特,對(dui)你(ni)有很(hen)(hen)大幫(bang)助,請頂之,謝(xie)謝(xie)。
一、 控(kong)件分類(lei)
讓(rang)我(wo)們先從我(wo)們熟悉(xi)的控件(jian)分類開始,因為這樣理解更(geng)直觀。
WP7里基(ji)本控件可(ke)以分為以下四類:
1.文(wen)本(ben)控件:主要用于(yu)顯示(shi)和輸(shu)入文(wen)本(ben)
2.內容(rong)控(kong)件(jian):主(zhu)要(yao)用于包含一個(ge)子(zi)控(kong)件(jian)元素UIElement(UIElement是所有(you)可視UI控(kong)件(jian)的(de)基類,我(wo)叫它(ta)第三代(dai)控(kong)件(jian)祖(zu)宗)
3.項(xiang)集合控件(jian):從(cong)名(ming)字可以知(zhi)道,它(ta)是包含(han)有多個子項(xiang)的控件(jian),如ListBox
4.容器控件:它可以包含有多(duo)個子(zi)控件元素(UIElement)
如下表所示,常用(yong)基本控(kong)件(jian)。
| 控件 | 控件類型 | 內容屬性 | 
| 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 | 
二、主(zhu)要控件基(ji)類
  System.Windows.Controls命名空間下,包含以下幾個主要的控件基類:
   ? Control
   ? ContentControl
    ? ItemsControl
    ? Panel
1. Control:表示用戶界面控件的(de)基類
 
主要屬性:
? Control.Template 屬性(xing):
通(tong)過(guo)將ControlTemplate應(ying)用(yong)給Control.Template 屬(shu)性(xing)來定義(yi)(yi)其(qi)外(wai)觀。所有(you)繼承自(zi)(zi)Control類(lei)的(de)子(zi)類(lei),都繼承Template屬(shu)性(xing),也(ye)就意(yi)味著,你(ni)可以通(tong)過(guo)自(zi)(zi)定義(yi)(yi)ControlTemplate來實(shi)現Control子(zi)控件的(de)自(zi)(zi)定義(yi)(yi)。 注意(yi):它有(you)一個子(zi)類(lei)UserControl,用(yong)于(yu)(yu)快速創建控件,不(bu)過(guo),你(ni)不(bu)能(neng)自(zi)(zi)定義(yi)(yi)ControlTemplate,并將它應(ying)用(yong)于(yu)(yu)UserControl。
主要事件:
  ? GotFocus,LostFocus 
  當控件獲得或失去(qu)焦點時(shi)回調(diao)
  MouseLeftButtonUp ,MouseMove ,MouseLeftButtonDown
 當控件(jian)被點(dian)擊,移動時分別回調
 ManipulationStarted ,ManipulationDelta, ManipulationCompleted
 當用(yong)戶(hu)(hu)對控(kong)件開始(shi)進(jin)行(xing)操作(zuo)時回(hui)調ManipulationStarted,當用(yong)戶(hu)(hu)對控(kong)件操作(zuo)并(bing)更改(gai)位置時回(hui)調ManipulationDelta,當用(yong)戶(hu)(hu)對控(kong)件停止操作(zuo)時,回(hui)調ManipulationCompleted。
SizeChanged
當代(dai)表控件(jian)大小的ActualHeight 或(huo) ActualWidth屬性(xing)改變時回調
2. ContentControl:是其他內容控(kong)(kong)件的基類(lei),表(biao)示包含單項元素的內容控(kong)(kong)件。像 Button、CheckBox 和 ScrollViewer 這樣的控(kong)(kong)件直(zhi)接或間接繼承自該(gai)類(lei)。
  
主要屬性(xing):
? ContentControl. Content 屬(shu)性(xing):
ContentControl.Content 屬性(xing)可(ke)以(yi)是任何(he)類型的對象,例如(ru)字符串、UIElement 或 DateTime。當ContentControl.Content 設置為 UIElement 時(shi),ContentControl 中將(jiang)顯示(shi) UIElement。當ContentControl.Content 設置為其他類型的對象時(shi),ContentControl 中將(jiang)顯示(shi)該對象的字符串表示(shi)形(xing)式(shi)。
注意(yi):ContentControl 具有(you)有(you)限的默(mo)認樣式。如果要增強該控件(jian)的外觀,可以創建新的 DataTemplate類型屬性用于自定(ding)義。
ContentControl. ContentTemplate屬性:
它是一(yi)個DataTemplate對(dui)象(xiang)元(yuan)素,定義該ContentControl的(de)內容顯示外觀(guan)。
3. ItemsControl:是(shi)項(xiang)集(ji)合類的(de)基類。
  
主(zhu)要屬性:
? Items屬性(xing):
如果要(yao)顯示(shi)固(gu)定列表,則應當用一(yi)個或多(duo)個 FrameworkElement 子對象填(tian)充(chong)ItemsControl .Items屬性,并且(qie)不要(yao)指定ItemsSource。
? ItemsSource屬性:
如果要顯示對(dui)象(xiang)(xiang)數(shu)據(ju)源中(zhong)的(de)數(shu)據(ju),則應(ying)將ItemsSource指定(ding)為(wei)對(dui)某個對(dui)象(xiang)(xiang)的(de)引用。 通常,這可通過 Binding 聲明來實現,
? ItemsPanel屬性(xing):
設置該(gai)屬性來自(zi)定義項集(ji)合控件的布局方式,是一個(ge)ItemsPanelTemplate類型元(yuan)素。
? ItemTemplate屬性:
設置該(gai)屬(shu)性來指定項集合控(kong)件中(zhong),每一個Item項的數據顯示(shi)外觀,是(shi)一個DataTemplate類型(xing)元素。
4. Panel: 是容器控件的基類,比(bi)如:Canvas, Grid, StackPanel。
 
自定義布局行為可以(yi)(yi)通過以(yi)(yi)下(xia)方式來實現:從(cong) Panel 繼承并使用(yong) MeasureOverride 和(he)(he) ArrangeOverride 方法(fa)重寫默認度(du)量和(he)(he)排列行為。
上面解釋的(de)(de)(de)基類(lei)中(zhong)的(de)(de)(de)主(zhu)要(yao)屬(shu)性(xing)(xing)和(he)(he)方法是我們在(zai)自(zi)定(ding)義控(kong)(kong)件時(shi)去修改的(de)(de)(de)東西,通(tong)過(guo)中(zhong)間的(de)(de)(de)繼(ji)(ji)承(cheng)關系圖可以(yi)看得(de)出(chu),Panel類(lei)與Control類(lei)沒有任何繼(ji)(ji)承(cheng)關系,這也就從(cong)祖宗這輩上決定(ding)了(le)其(qi)孩子(zi)的(de)(de)(de)特性(xing)(xing)不一樣,所以(yi)在(zai)對兩(liang)個大分支類(lei)進行自(zi)定(ding)義時(shi)不一樣,Panel類(lei)主(zhu)要(yao)是包(bao)含其(qi)它控(kong)(kong)件的(de)(de)(de)容器控(kong)(kong)件,對容器控(kong)(kong)件的(de)(de)(de)主(zhu)要(yao)自(zi)定(ding)義就是設置不同的(de)(de)(de)被包(bao)含控(kong)(kong)件之間的(de)(de)(de)布局(ju),因(yin)此重載其(qi)兩(liang)個測量方法。而Contorl類(lei)是用戶交互類(lei),有外(wai)觀,有交互操作,對其(qi)子(zi)類(lei)主(zhu)要(yao)是自(zi)定(ding)義其(qi)外(wai)觀和(he)(he)操作,也就是說,通(tong)過(guo)設置其(qi)Template屬(shu)性(xing)(xing)和(he)(he)重載具體的(de)(de)(de)事件來(lai)達到目的(de)(de)(de)。
? ContentControl類是(shi)Control類的子(zi)類,它有Control的特(te)點,不(bu)過,它是(shi)內容控件,主要用(yong)來包(bao)含一個UIElement。
? 既然包含一個UIElement,就要設置這個UIElement的(de)內(nei)容,即:Content屬(shu)性。
? 通過ContentTempalte來定義這個被包含的(de)(de)UIElement的(de)(de)外(wai)觀(guan)(guan),因此,如果要自定義外(wai)觀(guan)(guan)那就是重新創建新的(de)(de)DataTempalte,應用到ContentTempalte屬性嘍。
? ItemsControl類(lei)是Control類(lei)的(de)(de)子(zi)類(lei),同樣(yang)繼承(cheng)了該繼承(cheng)的(de)(de)東(dong)西,它(ta)是個項集合(he)類(lei),可以包(bao)含多個子(zi)項Item。
? 它有Items屬(shu)性和ItemsSource讓用戶(hu)來指定(ding)包含哪些子項。
? 各子項之間要(yao)怎(zen)樣(yang)布局(ju),就有了ItemtPanel屬性用來(lai)讓用戶(hu)指(zhi)定(ding)。
? 每一個子項是一個內容控(kong)件,它具有ContentControl的特點,因此(ci)還要(yao)通過(guo)ItemTempalte屬性指定每一個項的外觀(guan)。

