雖然說自Windows Vista採用了AERO之後,Windows作業系統中應用程式預設的視窗就美觀了不少,但是對於喜歡應用程式有整體美的設計師來說,使用預設的視窗外觀對某些WPF應用程式來說,或許還是有可能造成破壞整體設計感的情況發生。所以,把預設的視窗外觀拔掉,讓設計師們更能展現設計的才能,針對不同的應用程式設計出不同的視窗外觀,想像起來是不是蠻美好的一件事呢?
雖然說自Windows Vista採用了AERO之後,Windows作業系統中應用程式預設的視窗就美觀了不少,但是對於喜歡應用程式有整體美的設計師來說,使用預設的視窗外觀對某些WPF應用程式來說,或許還是有可能造成破壞整體設計感的情況發生。所以,把預設的視窗外觀拔掉,讓設計師們更能展現設計的才能,針對不同的應用程式設計出不同的視窗外觀,想像起來是不是蠻美好的一件事呢?
以下就來跟各位分享使用WPF實作出自定外觀視窗的方法。這次的目標是做出如下的不規則外框視窗:
為了方便練習,請先使用Expression Blend建立一個標準的WPF應用程式,接著針對MainWindow.xaml做以下的調整:
-
勾選AllowsTransparence。
-
將WindowStyle改為None。
-
將ResizeMode改為NoResize。
做完上述三個步驟的話,我們會得到一個透明背景而且沒有外框的視窗。
接著就可以來打造我們自己要的視窗長相啦! 一般的視窗的Title區是可以供使用者拖拉進行視窗搬移的區域,還有用來縮小、放大、關閉視窗的按鈕也會放在這邊(當然,也可以發揮創意把按鈕放在別的地方)。
在這邊就順便分享一個簡單就可以做出透明自訂視窗的Title的偷吃步,有興趣又很懶的朋友們可以跟我一樣將MainWindow.xaml的LayoutRoot改為如下:
接著來看看CodeBehind的部份:
OK!!到這邊為止,我們就有一個可以拖拉移動的視窗啦!!
接下來,就是另一個重頭戲了!! 視窗只能移動當然是不夠的啊!! 還得要能任意的放大縮小才行!! 這時候,就要藉助Thumb這個控制項來幫我們完成後面艱巨的任務啦!!
為了實作出和一般的視窗一樣,能讓使用者拖拉視窗的外緣來調整視窗大小的功能,我們要在將八個Thumb分別放置在自訂視窗邊緣的八個位置,並且妥善命名(在CodeBehind會用到),另外,也順便設定每個Thumb所要使用的滑鼠游標:
八個Thumb放置妥當之後,就可以將它們的Opacity屬性設為0%,因為我們不希望在執行的時候它們會被顯示在畫面上;並且為每個Thumb的完成後的Xaml如下:
最後,我們就要在CodeBehind來撰寫處理視這八個Thumb被拖放時的EventHandler啦!! 而在這邊,我們得藉助Windows API和Com元件來完成,所以請記得加入System.Runtime.InteropServices及System.Windows.Interop這兩個Namespace的引用。
接著請服用以下的程式碼:
最後一步,將我們的八個Thumb控制項的PreviewMouseLeftButtonDown事件指定給thumb_PreviewMouseLeftButtonDown這個EventHandler來處理,就大功告成啦!!
完成後的Xaml如下:
OK!!大功告成!! 奉上專案源始碼來和大家一起慶祝: