WPF控件
- 控件分類概覽
- 常用控件
- 常用控件代碼示例和效果
- 樣式與模板應用
- 樣式定義??方式
- 行內樣式??
- 頁面/窗口級資源樣式(Local Resource)
- 應用程序全局資源
- 獨立資源字典(ResourceDictionary)
- 控件模板(ControlTemplate)
- 主題樣式(Themes)
- 樣式繼承
- 樣式的優先級規則??
控件分類概覽
布局控件上一篇文章單獨講了,這篇就主要講其他類型的控件
常用控件
- 內容控件??
??Button??:觸發操作,可通過Content屬性嵌入任意內容(如文本、圖標)。
??Label??/??TextBlock??:顯示文本,前者支持快捷鍵綁定,后者輕量級。 - 條目控件??
??ListBox??/??ComboBox??:顯示列表數據,支持數據綁定和模板定制。
??DataGrid??:表格控件,支持排序、分頁和復雜數據展示。 - 輸入控件??
??TextBox??:單行文本輸入。
RichTextBox:支持富文本格式(字體、顏色、段落)。
??PasswordBox??:密碼輸入,隱藏明文。
??CheckBox??/??RadioButton??:多選和單選控件。 - ??特殊容器??
??TabControl??:分頁顯示,通過TabItem管理多視圖。
??Expander??:可折疊面板,節省空間
常用控件代碼示例和效果
其實主要需要理解的是TabControl 與 Expander 其他控件比較簡單易懂,這個例子看懂了基本上對于布局以及控件的常用基礎就差不多了,如果需求用到不常用的也可以單獨在去查看使用。
<Grid Margin="10"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><!-- 頂部工具欄 --><StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,0,0,10"><Button Content="點擊我" Click="Button_Click" Width="80" Margin="0,0,5,0"/><Label Content="用戶名:" VerticalAlignment="Center"/><TextBox Width="120" Margin="5,0" Text="測試管理員"/><PasswordBox Width="120" Margin="5,0" PasswordChar="*"/></StackPanel><!-- 主內容區 --><TabControl Grid.Row="1"><TabItem Header="數據展示"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="2*"/></Grid.ColumnDefinitions><!-- 左側選項 --><StackPanel Grid.Column="0" Margin="0,0,10,0"><GroupBox Header="選項設置"><StackPanel Margin="5"><CheckBox Content="啟用功能" Margin="0,5"/><RadioButton Content="模式A" GroupName="Mode" Margin="0,5"/><RadioButton Content="模式B" GroupName="Mode" Margin="0,5"/><Expander Header="高級選項"><StackPanel Margin="10,5"><TextBox Text="參數1"/><TextBox Text="參數2" Margin="0,5"/></StackPanel></Expander></StackPanel></GroupBox></StackPanel><!-- 中間分隔線 --><GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Center"/><!-- 右側表格 --><DataGrid Grid.Column="2" AutoGenerateColumns="False"ItemsSource="{Binding DataItems}"><DataGrid.Columns><DataGridTextColumn Header="ID" Binding="{Binding Id}"/><DataGridTextColumn Header="名稱" Binding="{Binding Name}"/><DataGridCheckBoxColumn Header="狀態" Binding="{Binding IsActive}"/></DataGrid.Columns></DataGrid></Grid></TabItem><TabItem Header="列表控件"><StackPanel Margin="10"><ListBox Height="150" ItemsSource="{Binding Items}"/><ComboBox Margin="0,10" ItemsSource="{Binding Items}" SelectedIndex="0"/></StackPanel></TabItem></TabControl><!-- 底部狀態欄 --><StatusBar Grid.Row="2"><StatusBarItem Content="就緒"/><Separator/><StatusBarItem Content="當前用戶: Admin"/></StatusBar></Grid>
public partial class MainWindow : Window{public MainWindow(){InitializeComponent();DataContext = this;}public ObservableCollection<string> Items { get; } = new ObservableCollection<string>{"選項一", "選項二", "選項三"};public ObservableCollection<DataItem> DataItems { get; } = new ObservableCollection<DataItem>{new DataItem { Id = 1, Name = "項目A", IsActive = true },new DataItem { Id = 2, Name = "項目B", IsActive = false }};private void Button_Click(object sender, RoutedEventArgs e){MessageBox.Show("按鈕被點擊!");}}public class DataItem{public int Id { get; set; }public string Name { get; set; }public bool IsActive { get; set; }}
樣式與模板應用
WPF通過樣式(Style)和模板(Template)實現界面統一與定制
樣式定義??方式
行內樣式??
直接設置控件屬性(如Background=“Blue”),適用于局部簡單調整。
<Button Content="臨時按鈕" Background="Red" Foreground="White"/>
頁面/窗口級資源樣式(Local Resource)
在 Window 或 Page 的 Resources 中定義樣式 適用于當前頁
??<Button.Style> 這種標簽里面寫style(資源式樣式)
<Window.Resources><Style x:Key="CustomButton" TargetType="Button"><Setter Property="Background" Value="#0078D4"/><Setter Property="Foreground" Value="White"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="#005A9E"/></Trigger></Style.Triggers></Style>
</Window.Resources>
<Button Style="{StaticResource CustomButton}" Content="按鈕"/>
應用程序全局資源
在 App.xaml 的 Application.Resources 中定義樣式 適用全局
<!-- App.xaml -->
<Application.Resources><Style x:Key="GlobalButton" TargetType="Button"><Setter Property="Margin" Value="10"/><Setter Property="Padding" Value="8"/></Style>
</Application.Resources><!-- 任意頁面使用 -->
<Button Style="{StaticResource GlobalButton}" Content="全局按鈕"/>
獨立資源字典(ResourceDictionary)
將樣式拆分到獨立 XAML 文件,通過合并字典引用,大型項目模塊化樣式管理
創建 Styles/Buttons.xaml
<ResourceDictionary><Style x:Key="SuccessButton" TargetType="Button"><Setter Property="Background" Value="#4CAF50"/></Style>
</ResourceDictionary>在 App.xaml 中合并
<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Styles/Buttons.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary>
</Application.Resources>
控件模板(ControlTemplate)
通過 ControlTemplate 完全重構控件視覺樹。
??適用場景??:需要徹底改變控件外觀(如圓形按鈕)
資源字典中(推薦)
<!-- 在Window.Resources或App.xaml中定義 --><Window.Resources><Style TargetType="Button"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Grid><!-- 自定義外觀 --><Ellipse Fill="{TemplateBinding Background}"/><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/></Grid></ControlTemplate></Setter.Value></Setter></Style></Window.Resources>單個控件內
<Button Content="臨時按鈕"><Button.Template><ControlTemplate TargetType="Button"><Border Background="Red"/></ControlTemplate></Button.Template>
</Button>
TargetType:指定模板適用的控件類型(如 Button、CheckBox)。
TemplateBinding:將模板元素的屬性綁定到控件的依賴屬性(如 Background、Foreground)。
ContentPresenter:占位符,用于顯示控件的Content 屬性(如按鈕文本)
主題樣式(Themes)
通過 ThemeInfo 和主題資源字典實現動態換膚。
??適用場景??:需要支持多套主題切換(如白天/夜間模式)
在 App.xaml.cs 中設置主題
public partial class App : Application
{public void ChangeTheme(string themeName){Resources.MergedDictionaries.Clear();Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri($"/Themes/{themeName}.xaml", UriKind.Relative) });}
}
創建主題文件 Themes/Dark.xaml
<ResourceDictionary><Style TargetType="Button"><Setter Property="Background" Value="#333333"/></Style>
</ResourceDictionary>
樣式繼承
通過 BasedOn 復用基礎樣式??
<Style TargetType="Button" x:Key="PrimaryButton"><Setter Property="Background" Value="#2196F3"/>
</Style><Style TargetType="Button" x:Key="DangerButton" BasedOn="{StaticResource PrimaryButton}"><Setter Property="Background" Value="#F44336"/>
</Style>
樣式的優先級規則??
當直接設置屬性和樣式沖突時,優先級順序如下:
控件直接設置屬性 > 顯式樣式(Style) > 隱式樣式(無x:Key的樣式) > 控件默認樣式
?隱式樣式的作用域??
無 x:Key 的