淺談 WPF控件

首先咱們必須知道在WPF中,控件一般被描述爲和用戶交互的元素,也就是可以接收焦點並響應鍵盤、鼠標輸入的元素。咱們能夠把控件想象成一個容器,容器裏裝的東西就是它的內容。控件的內容能夠是數據,也能夠是控件。控件的內容也是內存中的對象。控件經過本身的某個屬性引用着做爲內容的對象,這個屬性稱爲Content Property(內容屬性)。固然這個內容屬性具體到每種控件上都有本身的名字和類型:有的是object類型的Content,有的是object的Child;有些控件的內容是實現了集合接口的Items、Children等。ide

咱們常見的控件,大體能夠分爲以下幾類:佈局

 · 內容控件字體

 · 帶有標題的內容控件ui

 · 文本控件spa

 · 列表控件操作系統

 · 基於範圍的控件code

 · 日期控件對象

 

接下來咱們先了解一下控件類,而後再簡單介紹一些控件,這就是本章節的大體內容。blog

WPF窗口充滿了各類元素,若是不考慮控件的內部組成,只觀察由控件組成的「樹」,咱們稱之爲Logic Tree(邏輯樹);WPF中控件每每是由更基本的控件構成的,也就是說控件自己就是一顆樹,若是連控件自己的樹葉考慮在內,那麼這顆比Logic Tree更「茂盛」的樹,咱們稱之爲Visual Tree(可視化樹)。繼承

全部的控件都基礎自System.Windows.Control類,該類具備以下的基礎結構:

 · 能夠設置控件內容對齊方式

 · 設置Tab鍵順序的能力

 · 支持繪製背景、前景和邊框

 · 支持格式化文本內容的尺寸和字體

 

 全部控件都有背景和前景的概念。背景指控件的表面,而前景是文本。在WPF中,分別使用Background和Foreground這2個屬性設置。可是這2個屬性不是使用Color對象,而是使用一種更增強大的Brush對象(經常使用的有SolidColorBrush、LinearGradientBrush、TileBrush)。

咱們先來看一下使用代碼設置:

    Button button1 = new Button();
    button1.Background = new SolidColorBrush(Colors.Gray);

    Button button2 = new Button();
    button2.Background = new SolidColorBrush(Color.FromRgb(0, 255, 0));

    Button button3 = new Button();
    button3.Background = new SolidColorBrush(SystemColors.ControlColor);

    Button button4 = new Button();
    button4.Background = SystemColors.ControlBrush;

button1咱們直接使用Colors類的靜態屬性建立了一個SolidColorBrush對象;button2使用R、G、B標準建立;button3和button4都是從操做系統中獲取畫刷,只是button4比較簡便,由於SystemColors提供了ControlBrush靜態屬性。

button3和button4有一個共同的缺點就是:他們都是獲取的系統顏色或者畫刷的快照,因此當咱們把代碼運行以後再修改系統顏色等,程序的顏色不會改變。若是須要能隨着系統改變而改變,可使用動態資源。

咱們也能夠在XAML中直接使用顏色名稱或者顏色值來設置(這是由於咱們有TypeConverter特性):

    <Button Background="Gray">Button1</Button>
    <Button Background="#FFFF0000">Button2</Button>

 

Control類還包含一些與字體相關的屬性,這些屬性定義了文本在控件中顯示的方式:FontFamily、FontSize、FontStyle、FontWeight、FontStretch。

咱們在設置FontFamily的時候可使用逗號(,)來分隔多個字體,若是第一個字體不存在,它會按照順序查找逗號分隔的字體。若是字體中確實包含逗號,就須要使用逗號的轉義符。

咱們還可使用嵌入字體方式來設置FontFamily:

咱們把須要嵌入的字體添加到項目,而後設置該字體文件的屬性,把Build Action設置爲Resource。咱們就能夠在設置控件的時候直接使用 ./# (./ 表示的意思是當前文件夾)符號:

<Button FontFamily="./#Bayern">Button1</Button>

 

還須要提一下的就是Cursor屬性,雖然屬性聲明在FrameworkElement類中,而不是Control類,可是咱們常常都要爲控件指定鼠標的狀態。咱們可使用Cursors的靜態屬性,也可使用自定義的光標文件。咱們還能夠經過Mouse.OverrideCursor = Cursors.Help; 設置整個窗口的Cursor來覆蓋每一個元素的Cursor。這裏就不對Cursor進行過多的敘述了。下面咱們來看一下具體的控件分類。

 

內容控件

具備以下特色:

 · 都派生自ContentControl類

 · 內容屬性的名稱都是Content

 · 只能由單一元素充當其內容(固然仍然能夠在單個內容裏放置大量內容,訣竅就是使用單個佈局)

咱們查看ContentControl類的源代碼就知道,Content屬性支持的是一個object對象。可是能夠把該屬性包含的對象分爲2大類:

1.未繼承自UIElement類的對象:直接調用ToString()方法顯示文本
2.繼承自UIElement類的對象:這些對象使用UIElement的OnRender()方法在內容控件內部進行顯示

有一點須要注意,雖然Window也是派生自ContentControl類,可是他不能放到內容控件中。Window元素必須做爲頂級容器。

固然也須要用到一些關於內容對齊,邊距之類的屬性:HorizontalContentAlignment、VerticalContentAlignment、Padding。不過這些屬性都是在Control類中定義的。

常見的控件有:Label、Button、CheckBox、RadioButton、ToolTip、ScrollViewer等。

 

帶有標題的內容控件

具備以下特色:

 · 它們都派生自HeaderedContentControl類,而HeaderedContentControl又派生自ContentControl

 · 除了顯示內容的Content屬性外,還有一個顯示標題的Header屬性。他們都是內容屬性

 · 不管Content仍是Header都只能容納一個元素做爲內容

常見的控件有:GroupBox、TabItem、Expander。

 

 文本控件

常見的文本控件有TextBox、TextBlock、PasswordBox、RichTextBox。和前面看到的內容控件不一樣,文本控件顯示的內容是有限制的。

TextBox:內容屬性爲string類型的Text,只能顯示簡單文本。

TextBlock:內容屬性爲集合類型的InlineCollection;可是一樣也保留了string類型的Text屬性,用於顯示簡單文本。

PasswordBox:由Password屬性來處理字符串內容,可是內部使用了SecureString來減輕特定類型的攻擊。

RichTextBox:內容屬性爲FlowDocument類型的Document,能夠存儲更加複雜的內容。

 

列表控件 

具備以下特色:

 · 派生自ItemsControl類

 · 內容屬性爲Items或者ItemsSource

 · 每種ItemsControl都有本身的Item Container(條目容器)

 常見的有ListBox、ComboBox。

 

基於範圍的控件

常見的控件有:ScrollBar、ProcessBar、Slider。他們都繼承自RangeBase,而RangeBase由繼承自Control類。

 

日期控件

常見的控件有:Calender、DatePicker。這2個控件均可以選擇一個日期。

 

至於每種控件的具體用法能夠參照MSDN文檔。

相關文章
相關標籤/搜索