透過
microsoft
對windows vista
及wpf
的強力行
銷,相信許多讀者對於wpf的ui能力只有驚豔二字可以形容,對於如何使用wpf來達到這些效果,基於雜誌與網路上已有相當多的文章討論,筆者於此就不再重述了,直接將主軸放在wpf的核心,也就是她是如何建構出達到這些效果的環境。wpf強大的ui介面來自於兩個關鍵技術,一是繪製控制項的系統,在傳統的windows程式中,多半是使用windows內建的控制項來建構ui介面,這些控制項有combobox、textbox、richtextbox、button等等,直接使用這些控制項除了可以給予使用者一致的操作介面外,也由於她們是windows內建的控制項,所以效能上也有一定程度的表現,但這樣一來,控制項的外觀也受到了限制,對於combobox中顯示多欄資料、將textbox旋轉45度等效果均難以達成,當然!許多熟悉windows的程式設計師會提出,要達到這些效果,只要不使用內建的控制項,自行建立window物件,然後繪製所要的外觀即可,是的!這的確是於過往時代達到這些效果的方法之一,但!這實在是太繁瑣了,因為除了外觀外,程式設計師還得處理相當多的訊息,簡略的說!當想製作乙個可旋轉的textbox時,程式設計師除了繪製外觀外,還得處理鍵盤、滑鼠等訊息。在wpf時代,這一切都將變得簡單,因為wpf中幾乎所有的控制項都是由wpf繪製出來的,這可以使用spy++工具來觀察windows forms與wpf程式來證實(上方是wpf程式,下方是windows forms程式)。
這兩個程式的ui介面是相同的,但讀者可以由圖中看出,windows forms(下方)的視窗中還擁有button2、button1等子控制項,但上方的wpf僅有乙個視窗,這就是wpf的big handle概念,只使用乙個windows所提供的基礎物件:window,而這個window下的所有子控制項皆為wpf所畫出並管理,所以spy++只能看到乙個基礎物件window。因為wpf是畫出控制項的,這也意味著要在wpf中將textbox旋轉是可能的,而事實上!wpf中的控制項已經提供了旋轉的能力,即使程式設計師有需求欲撰寫自訂的控制項,也只需繼承自uielement(wpf中ui控制項的基礎類別)即可擁有旋轉的能力。那麼訊息部份該如何處理呢?這就得談到wpf的第二個關鍵技術:自成一格的訊息系統,當使用者於window上移動滑鼠時,window會收到來自windows系統的wm_mousemove訊息,接著window會依據訊息中的x、y指標資訊,取得對應的uielement物件來轉送訊息,整個執行的模擬圖如下。
在wpf
的window
模式下,
dispatcher
負責收取來自
windows
的訊息,再轉送給各個視窗,也就是
window
的hwndsource
物件,此物件會一一呼叫掛載的
inputprovider
物件來處理輸入訊息,此例中掛載了兩個
inputprovider
物件:hwndkeyboardinputprovider
、、hwndmouseinputprovider
,分別處理鍵盤及滑鼠訊息,以
hwndmouseinputprovider
來說,當收到滑鼠訊息後,她會先計算滑鼠位置,找到對應的
uielement
,然後會呼叫
inputmanager
來派送訊息至該
uielement
。那dispatcher
又是由誰喚起的呢?以
window
模式的wpf
程式來說,答案是
物件的run
函式,她會呼叫
dispatcher
的run
函式,此函式會進入收取訊息的迴圈,直到此程式被關閉為止。
WPF UI介面的革新
2007年05月02日 08 22 00 透過microsoft 對windows vista 及wpf 的強力行 銷,相信許多讀者對於wpf的ui能力只有驚豔二字可以形容,對於如何使用wpf來達到這些效果,基於雜誌與網路上已有相當多的文章討論,筆者於此就不再重述了,直接將主軸放在wpf的核心,也就...
WPF UI介面的革新
透過 microsoft 對windows vista 及wpf 的強力行 銷,相信許多讀者對於wpf的ui能力只有驚豔二字可以形容,對於如何使用wpf來達到這些效果,基於雜誌與網路上已有相當多的文章討論,筆者於此就不再重述了,直接將主軸放在wpf的核心,也就是她是如何建構出達到這些效果的環境。wp...
WPF UI介面的革新
透過microsoft 對windows vista 及wpf 的強力行 銷,相信許多讀者對於wpf的ui能力只有驚豔二字可以形容,對於如何使用wpf來達到這些效果,基於雜誌與網路上已有相當多的文章討論,筆者於此就不再重述了,直接將主軸放在wpf的核心,也就是她是如何建構出達到這些效果的環境。wpf...