BOO大全/WinForm
雖然 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)