WPF 提供強大的組合、樣式、模板機制,許多需求無需寫新控件即可滿足。
將現有控件組合成新控件。例:Button 內容放入 StackPanel 含 TextBlock + Polygon 圖示。
優點:簡單、無需代碼、按鈕行為保留。
<Button Height="50" Width="50">
<StackPanel>
<TextBlock>Play</TextBlock>
<Polygon Points="0,0 0,26 17,13" Fill="Black"/>
</StackPanel>
</Button>
只改外觀屬性(如邊框顏色)。可建立具名樣式或隱式樣式 (無 x:Key) 套用所有同類型控件。
<Style TargetType="Button" x:Key="RedButton">
<Setter Property="BorderBrush" Value="Red"/>
</Style>
<Button Style="{StaticResource RedButton}" .../>
完全重定義控件視覺樹。透過 ControlTemplate 替換預設外觀,支援 TemplateBinding 綁定控件屬性 (Width/Height 等)。
<Style TargetType="{x:Type Button}" x:Key="PlayButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Ellipse Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" .../>
<Polygon Points="18,12 18,38 35,25" Fill="Black"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
| 特性 | UserControl | Custom Control |
|---|---|---|
| 開發模式 | 類似頁面/視窗開發,XAML + Code-behind | 純代碼繼承 Control,外觀由 generic.xaml 定義 |
| 適用場景 | 組合現有元件、無需複雜模板/主題 | 需完整模板/主題支援、可調整大小、作為容器 |
| 遷移難度 | 易遷移至 Custom Control | — |
不確定時先用 UserControl,遇限制再轉 Custom Control。
UserControl。DependencyProperty (IconColor, MediaPlayer) 支援綁定/動畫。MouseLeftButtonUp 切換播放/暫停圖示並控制 MediaElement。xmlns:cust="clr-namespace:CustomWPF" 使用 <cust:PlayButton/>。Themes/generic.xaml。ControlTemplate,用 TemplateBinding 綁寬高。VisualBrush 讓圖示隨按鈕縮放。Icon DependencyProperty (Enum),在模板中用 Trigger 切換 Path Data。OnMouseLeftButtonUp 處理點擊邏輯。Control 或更基礎類別 (FrameworkElement, Panel) 視需求而定。