C#開發WPF/Silverlight動畫及游戲系列教程(Game Tutorial):(四十四)制作主角屬性面板及加點器
游戲中會使用大量的菜單面板,而這些面板往往都帶有選項卡。如果用Silverlight工具中的TabControl,則需要通過復雜的xaml重寫模板來實現自定義樣式,這一點時常讓開發者頭疼,畢竟界面的東西應該屬於美工的范疇,這也是我所發現在目前Silverlight中唯一一處只能通過xaml而無法用代碼實現的地方。當然,如果您對此特別感興趣,同樣可以到http://www.codeplex.com/Silverlight中下載最新的開源工具源碼,其中的示例項目中有非常詳細的模板重寫案例。本節,我將通過創建用戶控件的方式來創建自定義的TabControl和RepeatButton,實現主角屬性面板及其中的屬性加點器。
首先,我創建一個QXTabControl用戶控件,該控件界面可以很簡單,只需要包含一個頭和一個身體即可:
<UserControl x:Class="QXGameEngine.Control.QXTabControl"
XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
XMLns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas>
<StackPanel x:Name="Head"/>
<ContentPresenter x:Name="Body"/>
</Canvas>
< /UserControl>
Head 用做TabItem的容器,作為StackPanel類型控件,它可以對內部控件進行橫排或豎排,從而基本滿足大多數情況需要;而Body是ContentPresenter類型,在第四十二節中我曾提及過它,相當於一個萬用變身控件,將它作為選項卡的身體部分再合適不過了。當我們點擊不同的選項卡時,將不同的面板控件作為值賦予給Body,輕松實現高度自由的選項內容變換。
那麼用什麼控件來替代TabItem呢?在《劍俠世界》中,選項卡做得別具特色,不光在默認情況下鼠標進入與離開會呈現不同的圖片;當被點中後,同樣實現另外的兩張圖片間的切換。這樣的效果相當精致,而我們又該如何將它實現呢?此時,不得不想到我們可愛的QXIcon控件,我為它添加了新的類型:IconTypes.HitModes,定義很簡單,根據該控件是否被點擊從而對4張圖片進行相應切換:
case IconTypes.HitModes:
this.MouseEnter += (s, e) => { Container.Background = Hit ? HitNewBodySource : NewSource; };
this.MouseLeave += (s, e) => { Container.Background = Hit ? HitBodySource : _BodySource; };
this.MouseLeftButtonDown += (s, e) => { Hit = Hit ? false : true; };
break;
實現後的效果如下圖: