針對 RPG、SLG 類遊戲大量使用的可拖曳懸浮視窗需求,分析三種 ChildWindow 實現方案的優劣,最終選定用戶控件方案。
Visual Studio 專案範本「Silverlight 樣板化控件」生成 Themes/Generic.xaml:
<Style TargetType="local:QXChildWindow">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:QXChildWindow">
…樣板內容…
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
實測問題:中文支援差、OnApplyTemplate 重寫不靈活、擴充性與開發難度不理想。
繼承 UserControl,XAML 結構極簡卻高度彈性:
<UserControl x:Class="QXGameEngine.Control.QXChildWindow"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
MouseLeftButtonDown="UserControl_MouseLeftButtonDown">
<Canvas>
<Canvas x:Name="Head" MouseLeftButtonUp="Head_MouseLeftButtonUp" MouseMove="Head_MouseMove">
<ContentPresenter x:Name="HeadPresenter" />
<Rectangle x:Name="CloseButton">
<ToolTipService.ToolTip>
<TextBlock x:Name="Tip" Text="關閉" />
</ToolTipService.ToolTip>
</Rectangle>
</Canvas>
<Canvas x:Name="Body">
<ContentPresenter x:Name="BodyPresenter" />
</Canvas>
</Canvas>
</UserControl>
核心優勢:
ContentPresenter 實現頭部與主體內容的任意替換 (圖片、文字、複雜面板)