WPF學習之一:應用程序創建

從今天開始,我將開始WPF的學習。

一、WPF介紹

首先,我們來看看什么是WPF?WPF是Windows Presetation Foundation的縮寫,稱為窗口顯示基礎。它被微軟作為下一代顯示系統隆重推出,其意義可想而知。通過WPF,我們可以創建獨立的Windows客戶端應用程序和基于瀏覽器的應用程序。按照MSDN的介紹:WPF的核心是一個與分辨率無關并且基于向量的呈現引擎,旨在利用現在圖形硬件的優勢。

二、創建WPF

上面已經介紹,WPF可以創建兩種應用程序,那么下面,我將分別介紹如何創建這兩種應用程序。

我使用的開發工具是Visual Studio 2008英文版,此文檔只是對自己學習的一個總結,并沒有作為教程而描述其它所有可能性的意向,因此如果由于您使用的是其它版本的IDE而造成圖片界面有所區別,敬請見諒。

1、 創建獨立應用程序

1) 打開VS2008IDE,選擇FileàNewàProject,打開一個新建對話框。我使用的是C#語言,所以我選擇Visual C#下面的Windows節點中的WPF Application。對話框右上角中存在一個.Net Framework版本選中,對于創建WPF應用程序,你可以選擇3.0或者3.5,我這里使用默認選擇3.5,并輸入解決方案名和項目名稱AloneApplication。如下圖所示:

clip_image002

2) 創建應用程序后,IDE默認給你創建了一個window。一個window有一個UI和Xaml組成。如下圖所示:

clip_image004

說明:Xaml是Extensible Application Markup Language的縮寫,稱為擴展應用程序標記語言,它是基于xml開發的。

3) 我從工具欄中拖出一個Button放置于窗口中,并取名為”單擊”,如下圖所示:

clip_image006

其對應的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運行,查看效果。

clip_image008

2、 創建基于瀏覽器的應用程序

1) 它和創建獨立應用程序差不多,打開VS2008IDE,選擇FileàNewàProject,打開一個新建對話框。我使用的是C#語言,所以我選擇Visual C#下面的Windows節點中的WPF Browser Application。如下圖:

clip_image010

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

clip_image012

clip_image014

在Grid中添加的Button按鈕的Xaml語句為:

<Grid>

<Button Height="23" Margin="112,107,113,0" Name="button1" VerticalAlignment="Top" Click="button1_Click">單擊</Button>

</Grid>

其對應的事件處理程序代碼為:

private void button1_Click(object sender, RoutedEventArgs e)

{

MessageBox.Show("Hello World!");

}

3) 最后,保存,并按鈕F5,查看效果。

clip_image016

可以看到,它是在一個瀏覽器中顯示。

4) 對于基于瀏覽器的應用程序,它其實可以部署在服務端,然后在客戶端通過瀏覽器訪問的方式,下載應用程序,并運行。

當你在客戶端瀏覽器中輸入如何地址:

clip_image018,在客戶端瀏覽器中就會出現下面的下載頁面,它會把服務端的應用程序下載到客戶端。

clip_image020

,下載完成后,運行的結果和上面描述的情況相同。那下載后,它究竟保存在哪里呢?我使用的是Vista,我們可以通過如下地址找到C:\Users\Administrator\AppData\Local\Apps\2.0。其它系統可以目錄地址不相同。但是你可以在C盤下通過搜索應用程序名稱找到下載目錄地址。

WPF學習之二:XAML學習

一、 什么是XAML

什么是XAML呢?XAML是擴展應用程序標記語言(Extensible Application Markup Language),它是微軟基于XML開發的一種聲明式的用于創建UI的語言。XAML一般都是定義.xaml后綴格式的文件中。

二、 XAML中的元素

XML中的每個通過尖括號括起來的標記都稱之為元素,XAML是基于XML產生的,因此對于這些標記,在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中定義好了一些規則,XAML中的一些元素對應了CLR中的類型(類或結構)。比如<Grid>元素就對應了System.Windows.Controls.Grid類型,當你通過XAML標記定義了<Grid></Grid>元素對的時候,就相當于在后臺代碼中寫一個實例化Grid的代碼(Grid grid = new Grid();),這樣就能在程序運行時,實例化對象。

對象元素的實例都是通過調用對象元素對應的CLR類型的默認構造函數進行創建的,因此類或結構如果需要作為對象元素,那么必須要有一個公開的默認構造函數

2、屬性(Property)元素

屬性元素用于設置對象元素的屬性(Property)。設置對象元素的屬性不是可以通過設置屬性(Attribute)值嗎?那為什么還需要屬性(Property)元素呢?這是因為簡單的屬性(Attribute)設置并不能滿足這個對象元素的屬性(Property)。但是對于同時支持屬性(Attribute)語法和屬性(Property)元素語法的屬性,我們可以選擇使用其中任何一種。

屬性元素的語法為:<類型名稱.屬性>內容</類型名稱.屬性>。其中的內容就是作為屬性值的某個類型的實例。

在上面的代碼例子中:<Button.Background>、<Button.Foreground>等都是屬性元素,其中包括的<SolidColorBrush Color="Blue"></SolidColorBrush>就是一個類實例。<Grid.Children>它也是屬性元素,但這個屬性元素等到將集合對象元素的時候再來詳細講述。

3、集合對象元素

集合對象元素指的是這個元素是一個對象元素,并且它對應的CLR類型是一個集合類型。這種類型的對象元素可以被省略。當你在標記代碼中使用了集合類型的屬性元素時,XAML處理器會自動創建相應的集合類型實例。根據MSDN說法,在XAML中這種特意省略集合對象元素的這種語法被稱為”隱式集合語法”。

“隱式集合語法”適用于實現Ilist或Idictionary的類型,或者適用于數組。

在上面給出的代碼中,在<Grid.Children>下面一層應該還存在一個<UIElementCollection>,但是它可以省略。此處不存在這個集合對象元素的另外一個原因是,它不能存在,因為這個類型不存在公開的默認構造函數。

三、 XAML中的屬性

1、 屬性(Attribute)語法

CLR類型中的屬性(Property)在XAML標記語言中通常表示為屬性(Attribute)。因此,通過設置對象元素的屬性(Attribute)成為設置設置屬性(Property)值最為直接的方法。

<Button Height="23" HorizontalAlignment="Left" Margin="25,51,0,0" Name="button1" VerticalAlignment="Top" Width="75">

如上面的代碼中,設置了Height(高度)、HorizontalAligment(水平對齊)等等屬性。

2、 屬性(Property)元素語法

這個語法功能在上面的元素板塊已經講述,此處便不做闡述了。

3、 集合屬性

這個屬性在上面集合對象元素處也已經講述,此處也不做闡述了。

4、 內容屬性

內容屬性是XAML提供的一個語言功能,它可以將CLR類型中的任何一個屬性作為該類型實例的內容屬性。設置內容屬性的方法是在類上設置ContentPropertyAttribute。在標記中,XAML內容屬性可以省略。同時,在標記中指定的任何子元素都將成為內容屬性的值。

如上面代碼<Grid.Children>,Children是Child從Panel中繼承獲得的,Panel將Children設置為其內容屬性。因此該屬性可以省略。

同時,必須注意,XAML內容屬性的值必須是連續的,即它必須全部在該對象元素的其它屬性元素之前或之后指定。

5、 附加屬性(Property)

XAML提供了一種語言功能,它允許你在任何元素上指定某些屬性,但是該屬性可以不在當前指定的元素上。

按照MSDN說法,附加屬性(Property)通常通過屬性(Attribute)語法來設置。其語法格式為所有者類型.屬性

看下面的代碼:

<DockPanel>

<Button DockPanel.Dock="Left" Height="23" Name="button1" Width="75">Button</Button>

</DockPanel>

上面的代碼中Button將被放置在DockPanel的左邊。通過這種附加屬性就可以把子元素中設置其在父元素中的位置。

6、 依賴屬性(Dependency Property)

依賴屬性是XAML提供的一種很好的功能,它提供了一種方法,通過這種方法使我們可以通過其它輸入值來計算目標屬性值。依賴屬性比較復雜,內容較多,下次再來詳述。

四、 XAML中的類型轉換(TypeConverter)

類型轉化其實不是在XAML中剛出現的,在以前的版本中就已經有了,那以前用于干什么呢?最常用的屬性窗口。屬性窗口的的屬性可不一定都是字符串,有許多復雜的類型,但是它都可以把它顯示成字符串的形式,為什么?就是利用了類型轉換,在字符串和不同類型之間進行轉換。

其實現在的XAML屬性(Attribute)也是如此,并非所有的屬性值都是字符串,但是通過類型轉換卻可以把它轉換成字符串,方便顯示。具體如何使用,以后詳述。

五、標記擴展(MarkupExtensible)

為什么要提供標記擴展功能呢?因為XAML需要一些標準功能或者默認行為無法滿足的功能,比如屬性賦值,它可能并不是直接賦一個字符串,而是要對已定義的對象的一個引用,由此便誕生了標記擴展。

標記擴展的語法是使用”{}”。

1、 特定于WPF的標記擴展

下面簡單列舉WPF中的重要標記擴展。

StaticResource:通過引用已定義資源的值來為XAML屬性提供值。

DynamicResource:通過將資源的引用推遲到運行時來為XAML屬性提供值。動態資源引用強制來每次訪問此類資源時都進行重新訪問。

Binding:按引用于元素的數據上下文來為屬性提供數據綁定值。

RelativeSource:在運行時,為了可以在元素樹中定位若干可能關系的Binding提供源信息。

TemplateBinding:提供數據模板綁定。

2、 XAML定義的標記擴展

x:Type:為所提供的類型提供Type對象。

x:Static:為屬性值提供已定義的靜態值。該靜態值必須在引用之前定義。

x:Null:將null指定為XAML屬性的值。

x:Array:為XAML中常規數組的創建提供支持。

六、XAML命名空間

1、系統命名空間映射

在每個通過VS進行創建的window或者page中,都存在以下兩個命名空間。

xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation

xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml

第一個指的是WPF命名空間,它包括了大部分的WPF類型,并將其作為默認命名空間。

第二個指的是XAML命名空間,它指的是XAML可擴展標記語言的命名空間。

XAML是一個語言規范,或者語言定義。而WPF則是基于這種語言的一個實現。

2、映射自己的命名空間

其實,我們自已也可以把我們定義的類的命名空間映射到XAML中。如下面所示:

xmlns:local="clr-namespace:WpfApplication1;assembly=WpfApplication1"

如果你映射的命名空間就在當前程序集內,則assembly可以省略。

3、 將CLR命名空間映射為XAML命名空間

上面說的系統命名空間其實它也有CLR命名空間,只是它通過了一種方式把它進行了轉換。它的方法就是使用XmlnsDefinitionAttribute。通過多次指定這個屬性,可以將多個CLR命名空間映射為XAML命名空間。

我們可以通過使用Reflector工具來查看PresentationFramework.dll。用藍色框框圈起來的就是相應的映射關系。

clip_image002