WPF 探究(一)

1、WPF介紹

WPF全稱 Windows Presentation Foundation,幹啥用的?
主要是用來製做Windows桌面客戶端軟件的。
.Net平臺下製做Windows桌面客戶端軟件主要有兩個,一個Winform,還有一個就是WPF了。html

事件驅動時代:開發客戶端便採用Winform,但是界面邏輯跟業務邏輯交織在一塊兒,其中的代碼隱藏類還包含了不少的事件,這樣的結果可想而知了,下降界面的渲染速度,並且代碼不太容易維護。
數據驅動時代:微軟便開發了專門針對數據的客戶端,WPF便所以產生。如今不少網站也是採用的數據驅動模式來開發的,好比國人尤大大開發的Vue,開發的時候只需注重數據,dom操做Vue會給你優雅的自動完成。前端

Winform優缺點:
優勢:簡單,易控制,不是太佔內存的
缺點:代碼耦合度高,不利於維護git

WPF優缺點:
優勢:支持MVVM模式,能夠作出很是絢麗的界面,好比某60殺毒軟件,某雷下載軟件即是採用這個開發出來的。
缺點:佔用的內存稍微高些,學習成本較高,須要理解數據綁定,事件綁定等較多概念。github

2、XAML

幹啥用的?很簡單,就是專門用來作軟件界面的,相似於html語言,也是一種標記語言。
html中定義一個按鈕web

1.<button>按鈕</button>  
2.<input type="button" value="按鈕" />

xaml中定義一個按鈕後端

1.<Button>按鈕</Button> 
2.<Button Content="按鈕" />  //將Button對象的屬性Content經過特性(Attribute)來賦值
3.<Button>按鈕</Button>
4.<Button>
      <Button.Content>按鈕</Button.Content>  //將屬性用做元素
  </Button>

在這裏有必要說明一下:
屬性(Property)與特性(Attribute)是不一樣的。
屬性是針對面向對象的,一個對象有哪些屬性,好比車的顏色,輪胎等,即是所謂的屬性。
至於特性,那是專門針對標籤的。Property與Attribute並不徹底映射的。大部分Attribute對應於 控件對象 的Property 一個標籤,至關於在後臺聲明瞭一個對象 意思就是,在後臺聲明瞭一個Button對象。
也就是說,接下來的兩段代碼意思是同樣的。服務器

//使用xaml語言編寫
<StackPanel>
      <Button Content="按鈕" />
</StackPanel>
//在後置代碼中編寫
Button button=new Button();
button.Content="按鈕";  //Content即是屬性,而在標籤中,則是特性(Attribute)
stackPanel.Children.Add(button);//在哪一個位置添加按鈕  StackPanel標籤的Name名稱

名稱空間

其中第二行 xmlns聲明的是WPF核心名稱空間。它包含了全部WPF類,相比第三行,它沒有使用前綴,也就是整個文檔的默認名稱空間。
第三行 是XAML名稱空間。它包含了各類XAML特性。相比第二行,它使用了前綴x。也就是說,能夠經過前綴x來使用該名稱空間。
x名稱空間裏面到底有什麼呢?
x名稱中主要含有標記擴展、特性跟XAML指令元素三大類。dom

名稱 做用
x:Class 指明代碼隱藏類,只能用於根節點
x:Key 經常使用在靜態資源,經過Key來指定具體的某個靜態資源
x:Name 跟標籤中的Name特性效果幾乎同樣
x:Code 在XAML中嵌入指令(幾乎不用)
... ...固然還有一些其餘不經常使用到的,就不說了

在XAML中,咱們可能會看到x:Name 跟Name,這二者效果是同樣的,都是給相應的對象Name屬性賦值。
其中,倒數第三行,聲明瞭第三方的控件名稱,也就是說,我能夠經過<pu:Button></pu:Button>前綴來使用第三方的控件。svg

你會發現,默認的名稱空間,感受是個web中的URI,一開始,我也是這樣覺得是引用web服務器上的資源的。其實否則,微軟這麼作是由於schemas.com域就是他本身的,只有微軟會使用它。佈局

代碼隱藏類(後置代碼)
在代碼聲明中,你會發現 x:Class="" 這個類即是代碼隱藏類,和界面是綁定在一塊兒的,原理是經過C# partial關鍵字實現的。在這個代碼隱藏類裏,咱們能夠寫該界面所對應的相關事件代碼,但這樣作容易致使界面代碼跟業務邏輯代碼耦合在一塊兒(Winform即是如此),這並非WPF設計的本意,WPF主要是根據MVVM思想來設計的,經過數據綁定、事件綁定來完全分離先後端,前端只用xaml來寫,代碼隱藏類裏面幾乎不寫代碼,按鈕相關事件寫在ViewModel裏面,這樣作,高內聚低耦合,易維護易擴展。

3、佈局

WPF佈局模型也是一個重大改進。在WPF問世以前,佈局都是採用的座標,就是位置是鎖死的,不會根據窗口的大小自動調整。WPF佈局採用的是相似Web中的流佈局,控件能夠自動的隨着窗口的大小自動調整。
一、StackPanel 相似web中的flex佈局
這個佈局容器很是簡單,就是水平(垂直)放置各個控件。一維佈局容器。

<StackPanel Orientation="Vertical">
      <Button Content="按鈕1" />
      <Button Content="按鈕2" />
      <Button Content="按鈕3" />
      <StackPanel Orientation="Horizontal">
            <Button Content="按鈕111" />
            <Button Content="按鈕222" />
            <Button Content="按鈕333" />
      </StackPanel>
</StackPanel>

圖片:

二、Grid
這個佈局容器很是強大,二維佈局容器。
它能夠指定一個相似表格的,能夠任意的定義幾行幾列。而後相應的控件能夠指定放在這個容器的第幾行第幾列。

<Grid>
      <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
      </Grid.ColumnDefinitions>
      <Button Grid.Row="0" Grid.Column="0">按鈕1</Button>
      <Button Grid.Row="0" Grid.Column="1">按鈕2</Button>
      <Button Grid.Row="1" Grid.Column="0">按鈕3</Button>
      <Button Grid.Row="1" Grid.Column="1">按鈕4</Button>
</Grid>

備註:
其中,Button使用了Grid.Column,在Button類中是沒有這個屬性的,但它是從Grid容器附加的。Grid.Column即是附加屬性
圖片:

三、還有一些其餘的佈局容器:WrapPanel、DockPanel、Canvas等,暫不介紹。
備註:
通常狀況下,使用StackPannel跟Grid佈局就夠了,若是遇到複雜一點的狀況下,佈局容器相互嵌套即可以解決。

4、元素和控件

元素:不容許經過指定模板來定製外觀

說明
Border 圍繞單個控件的邊框,能夠指定Background、BorderBrush和BorderThickness
Viewbox 可以拉伸和縮放子元素
TextBlock 用於顯示文本
RichTextBlock 顯示富文本
Image 顯示圖像,支持jpeg、png、bmp、svg,也支持gif動畫
... 還有一些其餘的,暫不介紹

控件:容許經過指定模板來定製外觀,這也是WPF的強大之處。
主要包含範圍控件、內容控件、按鈕、項控件這幾個大類。

控件 說明
TeetBox 用戶可輸入的文本
RichEditBox 容許輸入格式化的文本
PasswordBox 用於輸入密碼
DatePicker
CalendarDatePicker
CalendarView
用戶選擇日期
TimePicker 用戶輸入時間
ColorPicker 容許用戶選擇顏色
UserControl 能夠重用的控件
... 還有其餘的,暫不介紹

5、WPF示例項目GitHub地址(待更新)

https://github.com/Harry-Jon/WPF_Study

相關文章
相關標籤/搜索