上一章:例外處理 目錄


雖然 Mono 的 Windows form 尚未完備(譯註:現在已經差不多了),Windows form 仍然是個很適合用來建立使用者介面的架構。大部分的 Windows form 開發只要使用 Visual Studio 或 SharpDevelop 就可以搞定;使用這些工具會比較有效率,因為開發工具已經幫你完成很多代碼。但是這並不是一個學習 framework 的好方法 - 在相信表單設計工具之前,你最好還是先了解東西是怎麼放到一起的。

打造一個簡單的視窗是很直覺的:

import System.Windows.Forms

form = Form(Text : "Hello!")

Application.Run(form)

的確,這個程式沒有作任何有趣的事情,但是它卻是一個最基本而且有最簡架構的 Windows form 應用程式;建立一個視窗,然後傳給 Application.Run。不要忘了,我們可以直接在呼叫建構子的時候指定屬性的值,所以我們不另外寫 form.Text="Hello" 。

我們也可以使用互動的Boo環境來操作 Windows form 類別。(你需要一個不是終端機的互動環境,例如 SharpDevelop 或 SciBoo)

>>> import System.Windows.Forms
>>> import System.Drawing
>>> f = Form(Text : "Sample")
>>> btn = Button(Text : "Click me!")
>>> f.Controls.Add(btn)
>>> f.Show()

現在你有個帶有按鈕的視窗了。你也可以很容易的把動作繫結到按鈕的 Click 事件上。點擊按鈕,然後就能看到訊息:

>>> btn.Click += { print "I've been clicked!" }
>>> I've been clicked!

使用匿名函式(或Closure)就是這麼方便。注意,如果再次繫結其他動作,之前的動作仍然會被呼叫:

>>> btn.Click += def():
... 	print "again and again"
... 
>>> I've been clicked!
again and again

另一個更有趣的控制項是 PropertyGrid。設定 Dock屬性,可以讓控制項填滿整個視窗;設定SelectedObject屬性為你想要偵看的物件。這會出現一個可以設定其屬性的視窗:

>>> pg = PropertyGrid()
>>> pg.SelectedObject = f
>>> pg.Dock = DockStyle.Fill
>>> f.Controls.Remove(btn)
>>> f.Controls.Add(pg)

再舉個例子,切換 ControlBox 屬性可以讓視窗標題右邊的控制按鈕消失。

>>> f.ControlBox=false

最後以一個可以列出環境變數值的視窗應用程式作為結束,首先會將所有環境變數都放到 ListBox 裏面,當點選 ListBox 項目時,StatusBar 會顯示出該環境變數的值。

import System
import System.Windows.Forms
import System.Drawing

form = Form(Text : "Environment Variables")
list = ListBox(Dock : DockStyle.Fill)
form.Controls.Add(list)
sb = StatusBar(Dock : DockStyle.Bottom)
form.Controls.Add(sb)

for name in Environment.GetEnvironmentVariables().Keys:
  list.Items.Add(name)
	
list.SelectedIndexChanged += def():
  sb.Text = Environment.GetEnvironmentVariable(list.SelectedItem)

Application.Run(form)

上一章:例外處理 目錄