標籤:style tar ext color width get
介紹 Windows Presentation Foundation
WPF 是一個庫,為開發使用者介面提供了全新的模型,用它建立案頭的應用程式比使用 Windows 表單更有優勢;WPF 還提供了新的基於 XML 的語言 XAML,用於處理大量的表單布局,而讓 F# 專註於開發應用程式的感興趣部分。
注意
現在有幾種 XAML 設計器,這些設計器使用圖形化的所見即所得 (WYSIWYG)(WYSWIG)工具設計介面,然後,用 F# 為其添加互動性。例如,Mobiform 提供的設計器 Aurora (http://www.mobiform.com/eng/aurora.html), Microsoft 提供的設計器Expression Blend (http://www.microsoft.com/products/expression/en/expression-blend/default.mspx)。
WPF 是 .NET 3.0 的一部分,如果使用Vista,預設情況下已經安裝;[ 對於 Windows 7 及以上版本,.NET 3.0 需要手動安裝;但是,提供了更高版本的 .NET 中同樣包含 WPF ];其他的 Windows 使用者需要安裝 .NET 3.0 才能訪問 WPF,最好的方法是下載 Windows SDK for Windows Server 2008 and .NET Framework 3.5 (http://is.gd/521hd) 。這一節中的樣本需要引用以下的 dll:PresentationCore.dll、PresentationFramework.dll 和 WindowsBase.dll。
我們看到的第一個例子示範了如何用 XAML 建立一個簡單表單,然後用 F# 顯示出來。樣本顯示了表單 XAML 定義有四個控制項:兩個標籤,一個文字框,一個按鈕。
清單 8-5 用 XAML 建立的簡單表單
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="64"/>
<ColumnDefinition Width="128"/>
<ColumnDefinition Width="128"/>
<ColumnDefinition Width="128"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="24"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0" >Input:</Label>
<TextBox Name="input" Grid.Column="1" Text="hello"/>
<Label Name="output" Grid.Row="0" Grid.Column="2"></Label>
<Button Name="press" Grid.Column="3" >Press Me</Button>
</Grid>
</Window>
使用表單的 XAML 定義,需要做兩件事情:第一,載入窗的定義並顯示。但是,如果僅做到這個,不能提供與使用者的互動,因此,需要做另一件事情才能使表單具有互動性;第二,用 F# 為控制項添加事件處理常式。在這裡,我們為按鈕添加事件處理常式,把文字框的內容顯示到第二個標籤中。函數 createWindow 是一個通用的函數,用於載入 XAML 表單。用這個函數建立值 window;然後,把這個值傳遞給表單的 FindName 方法,找出表單中的控制項,這樣,就可以和控制項進行互動了;最後,在主(main)函數中建立應用程式(Application)類的執行個體,並用它顯示表單(見清單 8-6)。
清單 8-6 顯示XAML 表單並為它添加事件處理常式
open System
openSystem.Collections.Generic
open System.Windows
openSystem.Windows.Controls
openSystem.Windows.Markup
open System.Xml
//creates the window and loads the given XAML file into it
let createWindow (file: string) =
using (XmlReader.Create(file)) (fun stream->
(XamlReader.Load(stream) :?>Window))
//create the window object and add event handler
//to the button control
let window =
let temp = createWindow " ..\..\Window1.xaml"
let press = temp.FindName("press") :?>Button
let textbox = temp.FindName("input") :?>TextBox
let label = temp.FindName("output") :?>Label
press.Click.Add (fun _ -> label.Content <-textbox.Text )
temp
//run the application
let main() =
let app = new Application()
app.Run(window) |> ignore
[<STAThread>]
do main()
[ 前面說過,]為了編譯這個程式,必須添加引用: PresentationCore.dll、PresentationFramework.dll 和 WindowsBase.dll,它們通常在C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0 目錄。這一章的其他例子,都不需要添加引用,因為編譯器會自動引用庫。圖 8-7 是前面樣本建立的表單。
圖 8-7 用 XAML 和 F# 建立的表單
[
原文沒有敘述建立項目的過程。
第一步,建立一個 Fsharp 應用程式,把清單 8-6 的代碼複製過去;
第二步,在項目中添加新項,選擇文字檔,命名很重要,一定要是 Window1.xaml,把清單 8-5 的代碼複製過去;
第三步,添加引用 PresentationCore.dll、PresentationFramework.dll 和 WindowsBase.dll,還要加兩個System.Xml.dll、System.Xaml.dll;
第四步,如果現在運行,會出錯,提示找不到 Window1.xaml,改成" ..\..\Window1.xaml",具體原因未去深究。
現在再運行,應該沒有問題了。
]