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 的