摘要:WPF UI介面的革新
透過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程式來說,答案是Application物件的Run函式,她會呼叫Dispatcher的Run函式,此函式會進入收取訊息的迴圈,直到此程式被關閉為止。