WPF學(xué)習(xí)之一:應(yīng)用程序創(chuàng)建
從今天開始,我將開始WPF的學(xué)習(xí)。
一、WPF介紹
首先,我們來看看什么是WPF?WPF是Windows Presetation Foundation的縮寫,稱為窗口顯示基礎(chǔ)。它被微軟作為下一代顯示系統(tǒng)隆重推出,其意義可想而知。通過WPF,我們可以創(chuàng)建獨立的Windows客戶端應(yīng)用程序和基于瀏覽器的應(yīng)用程序。按照MSDN的介紹:WPF的核心是一個與分辨率無關(guān)并且基于向量的呈現(xiàn)引擎,旨在利用現(xiàn)在圖形硬件的優(yōu)勢。
二、創(chuàng)建WPF
上面已經(jīng)介紹,WPF可以創(chuàng)建兩種應(yīng)用程序,那么下面,我將分別介紹如何創(chuàng)建這兩種應(yīng)用程序。
我使用的開發(fā)工具是Visual Studio 2008英文版,此文檔只是對自己學(xué)習(xí)的一個總結(jié),并沒有作為教程而描述其它所有可能性的意向,因此如果由于您使用的是其它版本的IDE而造成圖片界面有所區(qū)別,敬請見諒。
1、 創(chuàng)建獨立應(yīng)用程序
1) 打開VS2008IDE,選擇FileàNewàProject,打開一個新建對話框。我使用的是C#語言,所以我選擇Visual C#下面的Windows節(jié)點中的WPF Application。對話框右上角中存在一個.Net Framework版本選中,對于創(chuàng)建WPF應(yīng)用程序,你可以選擇3.0或者3.5,我這里使用默認(rèn)選擇3.5,并輸入解決方案名和項目名稱AloneApplication。如下圖所示:

2) 創(chuàng)建應(yīng)用程序后,IDE默認(rèn)給你創(chuàng)建了一個window。一個window有一個UI和Xaml組成。如下圖所示:

說明:Xaml是Extensible Application Markup Language的縮寫,稱為擴(kuò)展應(yīng)用程序標(biāo)記語言,它是基于xml開發(fā)的。
3) 我從工具欄中拖出一個Button放置于窗口中,并取名為”單擊”,如下圖所示:

其對應(yīng)的Xaml代碼如下圖所示:
<Window x:Class="AloneApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Button Height="23" Margin="95,100,108,0" Name="button1" VerticalAlignment="Top" Click="button1_Click">單擊</Button>
</Grid>
</Window>
同時,編寫該按鈕的單擊事件處理程序,單擊后彈出一個對話框,顯示”Hello Workd”。代碼如下:
private void button1_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Hello World!");
}
4) 最后,保存,并按F5運行,查看效果。

2、 創(chuàng)建基于瀏覽器的應(yīng)用程序
1) 它和創(chuàng)建獨立應(yīng)用程序差不多,打開VS2008IDE,選擇FileàNewàProject,打開一個新建對話框。我使用的是C#語言,所以我選擇Visual C#下面的Windows節(jié)點中的WPF Browser Application。如下圖:

2) 創(chuàng)建應(yīng)用程序后的界面和上面的獨立應(yīng)用程序差不多,只是這里默認(rèn)創(chuàng)建的是一個Page。這里就不在重復(fù)講述添加Button及其事件處理程序的過程了。看以下貼圖:


在Grid中添加的Button按鈕的Xaml語句為:
<Grid>
<Button Height="23" Margin="112,107,113,0" Name="button1" VerticalAlignment="Top" Click="button1_Click">單擊</Button>
</Grid>
其對應(yīng)的事件處理程序代碼為:
private void button1_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Hello World!");
}
3) 最后,保存,并按鈕F5,查看效果。

可以看到,它是在一個瀏覽器中顯示。
4) 對于基于瀏覽器的應(yīng)用程序,它其實可以部署在服務(wù)端,然后在客戶端通過瀏覽器訪問的方式,下載應(yīng)用程序,并運行。
當(dāng)你在客戶端瀏覽器中輸入如何地址:
,在客戶端瀏覽器中就會出現(xiàn)下面的下載頁面,它會把服務(wù)端的應(yīng)用程序下載到客戶端。

,下載完成后,運行的結(jié)果和上面描述的情況相同。那下載后,它究竟保存在哪里呢?我使用的是Vista,我們可以通過如下地址找到C:\Users\Administrator\AppData\Local\Apps\2.0。其它系統(tǒng)可以目錄地址不相同。但是你可以在C盤下通過搜索應(yīng)用程序名稱找到下載目錄地址。
WPF學(xué)習(xí)之二:XAML學(xué)習(xí)
一、 什么是XAML?
什么是XAML呢?XAML是擴(kuò)展應(yīng)用程序標(biāo)記語言(Extensible Application Markup Language),它是微軟基于XML開發(fā)的一種聲明式的用于創(chuàng)建UI的語言。XAML一般都是定義.xaml后綴格式的文件中。
二、 XAML中的元素
XML中的每個通過尖括號括起來的標(biāo)記都稱之為元素,XAML是基于XML產(chǎn)生的,因此對于這些標(biāo)記,在XAML中也稱之為元素。但是XAML中的元素種類有很多,下面將分類闡述。下面先給出一段代碼,然后針對這段代碼講述各種元素。
<Grid>
<Grid.Children>
<Button Height="23" HorizontalAlignment="Left" Margin="25,51,0,0" Name="button1" VerticalAlignment="Top" Width="75">
<Button.Background>
<SolidColorBrush Color="Blue"></SolidColorBrush>
</Button.Background>
<Button.Foreground>
<SolidColorBrush Color="Red"></SolidColorBrush>
</Button.Foreground>
<Button.Content>
Click
</Button.Content>
</Button>
</Grid.Children>
</Grid>
1、對象元素
看上面的代碼例子,那幾個是對象元素呢?<Grid>和<Button>都是對象元素。在XAML中定義好了一些規(guī)則,XAML中的一些元素對應(yīng)了CLR中的類型(類或結(jié)構(gòu))。比如<Grid>元素就對應(yīng)了System.Windows.Controls.Grid類型,當(dāng)你通過XAML標(biāo)記定義了<Grid></Grid>元素對的時候,就相當(dāng)于在后臺代碼中寫一個實例化Grid的代碼(Grid grid = new Grid();),這樣就能在程序運行時,實例化對象。
對象元素的實例都是通過調(diào)用對象元素對應(yīng)的CLR類型的默認(rèn)構(gòu)造函數(shù)進(jìn)行創(chuàng)建的,因此類或結(jié)構(gòu)如果需要作為對象元素,那么必須要有一個公開的默認(rèn)構(gòu)造函數(shù)。
2、屬性(Property)元素
屬性元素用于設(shè)置對象元素的屬性(Property)。設(shè)置對象元素的屬性不是可以通過設(shè)置屬性(Attribute)值嗎?那為什么還需要屬性(Property)元素呢?這是因為簡單的屬性(Attribute)設(shè)置并不能滿足這個對象元素的屬性(Property)。但是對于同時支持屬性(Attribute)語法和屬性(Property)元素語法的屬性,我們可以選擇使用其中任何一種。
屬性元素的語法為:<類型名稱.屬性>內(nèi)容</類型名稱.屬性>。其中的內(nèi)容就是作為屬性值的某個類型的實例。
在上面的代碼例子中:<Button.Background>、<Button.Foreground>等都是屬性元素,其中包括的<SolidColorBrush Color="Blue"></SolidColorBrush>就是一個類實例。<Grid.Children>它也是屬性元素,但這個屬性元素等到將集合對象元素的時候再來詳細(xì)講述。
3、集合對象元素
集合對象元素指的是這個元素是一個對象元素,并且它對應(yīng)的CLR類型是一個集合類型。這種類型的對象元素可以被省略。當(dāng)你在標(biāo)記代碼中使用了集合類型的屬性元素時,XAML處理器會自動創(chuàng)建相應(yīng)的集合類型實例。根據(jù)MSDN說法,在XAML中這種特意省略集合對象元素的這種語法被稱為”隱式集合語法”。
“隱式集合語法”適用于實現(xiàn)Ilist或Idictionary的類型,或者適用于數(shù)組。
在上面給出的代碼中,在<Grid.Children>下面一層應(yīng)該還存在一個<UIElementCollection>,但是它可以省略。此處不存在這個集合對象元素的另外一個原因是,它不能存在,因為這個類型不存在公開的默認(rèn)構(gòu)造函數(shù)。
三、 XAML中的屬性
1、 屬性(Attribute)語法
CLR類型中的屬性(Property)在XAML標(biāo)記語言中通常表示為屬性(Attribute)。因此,通過設(shè)置對象元素的屬性(Attribute)成為設(shè)置設(shè)置屬性(Property)值最為直接的方法。
<Button Height="23" HorizontalAlignment="Left" Margin="25,51,0,0" Name="button1" VerticalAlignment="Top" Width="75">
如上面的代碼中,設(shè)置了Height(高度)、HorizontalAligment(水平對齊)等等屬性。
2、 屬性(Property)元素語法
這個語法功能在上面的元素板塊已經(jīng)講述,此處便不做闡述了。
3、 集合屬性
這個屬性在上面集合對象元素處也已經(jīng)講述,此處也不做闡述了。
4、 內(nèi)容屬性
內(nèi)容屬性是XAML提供的一個語言功能,它可以將CLR類型中的任何一個屬性作為該類型實例的內(nèi)容屬性。設(shè)置內(nèi)容屬性的方法是在類上設(shè)置ContentPropertyAttribute。在標(biāo)記中,XAML內(nèi)容屬性可以省略。同時,在標(biāo)記中指定的任何子元素都將成為內(nèi)容屬性的值。
如上面代碼<Grid.Children>,Children是Child從Panel中繼承獲得的,Panel將Children設(shè)置為其內(nèi)容屬性。因此該屬性可以省略。
同時,必須注意,XAML內(nèi)容屬性的值必須是連續(xù)的,即它必須全部在該對象元素的其它屬性元素之前或之后指定。
5、 附加屬性(Property)
XAML提供了一種語言功能,它允許你在任何元素上指定某些屬性,但是該屬性可以不在當(dāng)前指定的元素上。
按照MSDN說法,附加屬性(Property)通常通過屬性(Attribute)語法來設(shè)置。其語法格式為所有者類型.屬性。
看下面的代碼:
<DockPanel>
<Button DockPanel.Dock="Left" Height="23" Name="button1" Width="75">Button</Button>
</DockPanel>
上面的代碼中Button將被放置在DockPanel的左邊。通過這種附加屬性就可以把子元素中設(shè)置其在父元素中的位置。
6、 依賴屬性(Dependency Property)
依賴屬性是XAML提供的一種很好的功能,它提供了一種方法,通過這種方法使我們可以通過其它輸入值來計算目標(biāo)屬性值。依賴屬性比較復(fù)雜,內(nèi)容較多,下次再來詳述。
四、 XAML中的類型轉(zhuǎn)換(TypeConverter)
類型轉(zhuǎn)化其實不是在XAML中剛出現(xiàn)的,在以前的版本中就已經(jīng)有了,那以前用于干什么呢?最常用的屬性窗口。屬性窗口的的屬性可不一定都是字符串,有許多復(fù)雜的類型,但是它都可以把它顯示成字符串的形式,為什么?就是利用了類型轉(zhuǎn)換,在字符串和不同類型之間進(jìn)行轉(zhuǎn)換。
其實現(xiàn)在的XAML屬性(Attribute)也是如此,并非所有的屬性值都是字符串,但是通過類型轉(zhuǎn)換卻可以把它轉(zhuǎn)換成字符串,方便顯示。具體如何使用,以后詳述。
五、標(biāo)記擴(kuò)展(MarkupExtensible)
為什么要提供標(biāo)記擴(kuò)展功能呢?因為XAML需要一些標(biāo)準(zhǔn)功能或者默認(rèn)行為無法滿足的功能,比如屬性賦值,它可能并不是直接賦一個字符串,而是要對已定義的對象的一個引用,由此便誕生了標(biāo)記擴(kuò)展。
標(biāo)記擴(kuò)展的語法是使用”{}”。
1、 特定于WPF的標(biāo)記擴(kuò)展
下面簡單列舉WPF中的重要標(biāo)記擴(kuò)展。
StaticResource:通過引用已定義資源的值來為XAML屬性提供值。
DynamicResource:通過將資源的引用推遲到運行時來為XAML屬性提供值。動態(tài)資源引用強(qiáng)制來每次訪問此類資源時都進(jìn)行重新訪問。
Binding:按引用于元素的數(shù)據(jù)上下文來為屬性提供數(shù)據(jù)綁定值。
RelativeSource:在運行時,為了可以在元素樹中定位若干可能關(guān)系的Binding提供源信息。
TemplateBinding:提供數(shù)據(jù)模板綁定。
2、 XAML定義的標(biāo)記擴(kuò)展
x:Type:為所提供的類型提供Type對象。
x:Static:為屬性值提供已定義的靜態(tài)值。該靜態(tài)值必須在引用之前定義。
x:Null:將null指定為XAML屬性的值。
x:Array:為XAML中常規(guī)數(shù)組的創(chuàng)建提供支持。
六、XAML命名空間
1、系統(tǒng)命名空間映射
在每個通過VS進(jìn)行創(chuàng)建的window或者page中,都存在以下兩個命名空間。
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
第一個指的是WPF命名空間,它包括了大部分的WPF類型,并將其作為默認(rèn)命名空間。
第二個指的是XAML命名空間,它指的是XAML可擴(kuò)展標(biāo)記語言的命名空間。
XAML是一個語言規(guī)范,或者語言定義。而WPF則是基于這種語言的一個實現(xiàn)。
2、映射自己的命名空間
其實,我們自已也可以把我們定義的類的命名空間映射到XAML中。如下面所示:
xmlns:local="clr-namespace:WpfApplication1;assembly=WpfApplication1"
如果你映射的命名空間就在當(dāng)前程序集內(nèi),則assembly可以省略。
3、 將CLR命名空間映射為XAML命名空間
上面說的系統(tǒng)命名空間其實它也有CLR命名空間,只是它通過了一種方式把它進(jìn)行了轉(zhuǎn)換。它的方法就是使用XmlnsDefinitionAttribute。通過多次指定這個屬性,可以將多個CLR命名空間映射為XAML命名空間。
我們可以通過使用Reflector工具來查看PresentationFramework.dll。用藍(lán)色框框圈起來的就是相應(yīng)的映射關(guān)系。
