CheckBox(复选框)是WPF中最常用的控件之一,它允许用户选择或取消选择一个选项。CheckBox控件主要用于表示二元选择(是/否),也可以配置为三态模式来表示"是/否/不确定"三种状态。
CheckBox控件继承自ToggleButton,进而继承自ButtonBase类,这使它具有按钮的基本特性,同时具备了切换状态的能力。
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
IsChecked | 获取或设置复选框是否被选中 | bool? | false |
IsThreeState | 指定复选框是否支持三态 | bool | false |
Content | 设置复选框显示的内容 | object | null |
ClickMode | 指定何时触发Click事件 | ClickMode | Release |
事件 | 说明 |
---|---|
Checked | 当复选框被选中时发生 |
Unchecked | 当复选框取消选中时发生 |
Indeterminate | 当复选框处于不确定状态时发生(仅当IsThreeState=true时有效) |
Click | 当用户点击复选框时发生 |
以下是CheckBox的基本XAML用法:
<StackPanel Margin="10">
<Label FontWeight="Bold">应用程序选项Label>
<CheckBox Content="启用功能A" Margin="5"/>
<CheckBox Content="启用功能B" IsChecked="True" Margin="5"/>
<CheckBox Content="启用功能C" Margin="5"/>
StackPanel>
C#代码创建CheckBox:
// 创建一个CheckBox控件
CheckBox checkBox = new CheckBox();
checkBox.Content = "启用功能D";
checkBox.Margin = new Thickness(5);
checkBox.IsChecked = true;
checkBox.Checked += CheckBox_Checked;
// 添加到面板
stackPanel.Children.Add(checkBox);
事件处理:
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
CheckBox checkBox = sender as CheckBox;
MessageBox.Show($"选项 '{checkBox.Content}' 已被选中!");
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
CheckBox checkBox = sender as CheckBox;
MessageBox.Show($"选项 '{checkBox.Content}' 已取消选中!");
}
当设置IsThreeState属性为true时,CheckBox将支持三种状态:
不确定状态通常用于表示"部分选中"的情况,例如在层次结构中,当子项目部分选中时,父项目可以显示为不确定状态。
<StackPanel Margin="10">
<CheckBox Name="parentCheckBox" Content="全选" IsThreeState="True"
Checked="ParentCheckBox_CheckChanged"
Unchecked="ParentCheckBox_CheckChanged"
Indeterminate="ParentCheckBox_CheckChanged"/>
<StackPanel Margin="20,5,0,0">
<CheckBox Name="childCheckBox1" Content="子选项1"
Checked="ChildCheckBox_CheckChanged"
Unchecked="ChildCheckBox_CheckChanged"/>
<CheckBox Name="childCheckBox2" Content="子选项2"
Checked="ChildCheckBox_CheckChanged"
Unchecked="ChildCheckBox_CheckChanged"/>
<CheckBox Name="childCheckBox3" Content="子选项3"
Checked="ChildCheckBox_CheckChanged"
Unchecked="ChildCheckBox_CheckChanged"/>
StackPanel>
StackPanel>
相应的C#代码:
private void ParentCheckBox_CheckChanged(object sender, RoutedEventArgs e)
{
bool? isChecked = parentCheckBox.IsChecked;
// 如果父CheckBox是明确的状态(非null),则将所有子CheckBox设为相同状态
if (isChecked.HasValue)
{
childCheckBox1.IsChecked = isChecked.Value;
childCheckBox2.IsChecked = isChecked.Value;
childCheckBox3.IsChecked = isChecked.Value;
}
}
private void ChildCheckBox_CheckChanged(object sender, RoutedEventArgs e)
{
// 更新父CheckBox的状态
if (childCheckBox1.IsChecked == true &&
childCheckBox2.IsChecked == true &&
childCheckBox3.IsChecked == true)
{
// 全选
parentCheckBox.IsChecked = true;
}
else if (childCheckBox1.IsChecked == false &&
childCheckBox2.IsChecked == false &&
childCheckBox3.IsChecked == false)
{
// 全不选
parentCheckBox.IsChecked = false;
}
else
{
// 部分选中
parentCheckBox.IsChecked = null;
}
}
CheckBox继承自ContentControl,可以包含自定义内容而不仅仅是文本。
<CheckBox>
<TextBlock>
启用<Run Foreground="Red" FontWeight="Bold">高级Run>功能
TextBlock>
CheckBox>
<CheckBox>
<StackPanel Orientation="Horizontal">
<Image Source="/Images/settings.png" Width="16" Height="16" Margin="0,0,5,0"/>
<TextBlock Text="自定义设置"/>
StackPanel>
CheckBox>
<CheckBox Margin="5">
<DockPanel LastChildFill="True">
<Border DockPanel.Dock="Left" Background="LightBlue" Margin="0,0,5,0" Padding="3">
<TextBlock Text="新功能"/>
Border>
<TextBlock Text="启用云同步" VerticalAlignment="Center"/>
DockPanel>
CheckBox>
CheckBox可以与ViewModel中的布尔属性绑定:
<CheckBox Content="接收新闻邮件"
IsChecked="{Binding ReceiveNewsletter, Mode=TwoWay}" />
ViewModel中相应的属性:
private bool _receiveNewsletter;
public bool ReceiveNewsletter
{
get { return _receiveNewsletter; }
set
{
if (_receiveNewsletter != value)
{
_receiveNewsletter = value;
OnPropertyChanged("ReceiveNewsletter");
}
}
}
绑定到项目集合中的CheckBox:
<ItemsControl ItemsSource="{Binding FeatureList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}"
IsChecked="{Binding IsEnabled, Mode=TwoWay}"
Margin="5"/>
DataTemplate>
ItemsControl.ItemTemplate>
ItemsControl>
ViewModel中的集合和项类:
public class FeatureItem : INotifyPropertyChanged
{
private string _name;
private bool _isEnabled;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged("Name");
}
}
public bool IsEnabled
{
get { return _isEnabled; }
set
{
_isEnabled = value;
OnPropertyChanged("IsEnabled");
}
}
// INotifyPropertyChanged实现...
}
// ViewModel中的集合
public ObservableCollection<FeatureItem> FeatureList { get; set; }
<Style x:Key="CustomCheckBoxStyle" TargetType="{x:Type CheckBox}">
"Foreground" Value="DarkBlue"/>
"Background" Value="AliceBlue"/>
"BorderBrush" Value="Navy"/>
"BorderThickness" Value="1"/>
"Padding" Value="4,2"/>
"VerticalContentAlignment" Value="Center"/>
"IsMouseOver" Value="True">
"Background" Value="LightSkyBlue"/>
"IsPressed" Value="True">
"Background" Value="SkyBlue"/>
Style>
以下是一个现代风格的CheckBox模板例子:
<Style x:Key="ModernCheckBox" TargetType="{x:Type CheckBox}">
"SnapsToDevicePixels" Value="true"/>
"OverridesDefaultStyle" Value="true"/>
"FocusVisualStyle" Value="{x:Null}"/>
"Foreground" Value="#333333"/>
"Template">
"{x:Type CheckBox}">
"Auto"/>
"*"/>
x:Name="CheckBoxBorder"
Width="20" Height="20"
CornerRadius="3"
BorderThickness="2"
BorderBrush="#AAAAAA"
Background="Transparent">
x:Name="CheckMark"
Data="M 3,10 L 7,14 L 14,5"
StrokeThickness="2"
Stroke="#4CAF50"
StrokeEndLineCap="Round"
StrokeStartLineCap="Round"
Visibility="Collapsed"/>
"1"
Margin="8,0,0,0"
VerticalAlignment="Center"
HorizontalAlignment="Left"
RecognizesAccessKey="True"/>
"IsChecked" Value="True">
"CheckMark" Property="Visibility" Value="Visible"/>
"CheckBoxBorder" Property="BorderBrush" Value="#4CAF50"/>
"CheckBoxBorder" Property="Background" Value="#E8F5E9"/>
"IsMouseOver" Value="True">
"CheckBoxBorder" Property="BorderBrush" Value="#4CAF50"/>
"IsEnabled" Value="False">
"CheckBoxBorder" Property="BorderBrush" Value="#DDDDDD"/>
"CheckMark" Property="Stroke" Value="#BBBBBB"/>
"Foreground" Value="#BBBBBB"/>
"IsChecked" Value="{x:Null}">
"CheckMark" Property="Data" Value="M 4,10 L 16,10"/>
"CheckMark" Property="Visibility" Value="Visible"/>
"CheckBoxBorder" Property="BorderBrush" Value="#FF9800"/>
"CheckBoxBorder" Property="Background" Value="#FFF3E0"/>
"CheckMark" Property="Stroke" Value="#FF9800"/>
Style>
以下是一个模拟开关的CheckBox样式:
<Style x:Key="ToggleSwitchStyle" TargetType="{x:Type CheckBox}">
"SnapsToDevicePixels" Value="true"/>
"OverridesDefaultStyle" Value="true"/>
"Template">
"{x:Type CheckBox}">
"Auto"/>
"*"/>
x:Name="SwitchTrack"
Width="40" Height="20"
CornerRadius="10"
Background="#CCCCCC">
x:Name="SwitchButton"
Width="16" Height="16"
CornerRadius="8"
Background="White"
HorizontalAlignment="Left"
Margin="2,0,0,0"
VerticalAlignment="Center">
"1" BlurRadius="2" Color="#22000000" Opacity="0.3"/>
"1"
Margin="8,0,0,0"
VerticalAlignment="Center"
HorizontalAlignment="Left"
RecognizesAccessKey="True"/>
"IsChecked" Value="True">
"SwitchTrack" Property="Background" Value="#2196F3"/>
"SwitchButton" Property="Margin" Value="0,0,2,0"/>
"SwitchButton" Property="HorizontalAlignment" Value="Right"/>
"IsEnabled" Value="False">
"SwitchTrack" Property="Opacity" Value="0.5"/>
"SwitchButton" Property="Opacity" Value="0.7"/>
"Foreground" Value="#AAAAAA"/>
Style>
<StackPanel>
<TextBlock Text="通知设置" FontWeight="Bold" Margin="0,10,0,5"/>
<CheckBox Content="接收应用程序更新通知" Margin="5"/>
<CheckBox Content="接收新功能通知" Margin="5"/>
<CheckBox Content="接收促销信息" Margin="5"/>
<TextBlock Text="隐私设置" FontWeight="Bold" Margin="0,10,0,5"/>
<CheckBox Content="允许使用位置服务" Margin="5"/>
<CheckBox Content="匿名发送使用数据" Margin="5"/>
<TextBlock Text="外观设置" FontWeight="Bold" Margin="0,10,0,5"/>
<CheckBox Content="启用深色模式" Margin="5"/>
<CheckBox Content="显示高级选项" Margin="5"/>
StackPanel>
<StackPanel>
<TextBlock Text="选择要授予的权限:" FontWeight="Bold" Margin="0,0,0,10"/>
<CheckBox Name="allPermissions" Content="全部权限"
IsThreeState="True" Margin="5"
Checked="AllPermissions_Changed"
Unchecked="AllPermissions_Changed"
Indeterminate="AllPermissions_Changed"/>
<StackPanel Margin="20,0,0,0">
<CheckBox Name="readPermission" Content="读取权限" Margin="5"
Checked="Permission_Changed" Unchecked="Permission_Changed"/>
<CheckBox Name="writePermission" Content="写入权限" Margin="5"
Checked="Permission_Changed" Unchecked="Permission_Changed"/>
<CheckBox Name="executePermission" Content="执行权限" Margin="5"
Checked="Permission_Changed" Unchecked="Permission_Changed"/>
<CheckBox Name="adminPermission" Content="管理员权限" Margin="5"
Checked="Permission_Changed" Unchecked="Permission_Changed"/>
StackPanel>
StackPanel>
<StackPanel>
<TextBlock Text="筛选条件:" FontWeight="Bold" Margin="0,0,0,10"/>
<WrapPanel>
<CheckBox Content="未完成任务" Margin="5" Checked="Filter_Changed" Unchecked="Filter_Changed"/>
<CheckBox Content="今日到期" Margin="5" Checked="Filter_Changed" Unchecked="Filter_Changed"/>
<CheckBox Content="高优先级" Margin="5" Checked="Filter_Changed" Unchecked="Filter_Changed"/>
<CheckBox Content="已分配给我" Margin="5" Checked="Filter_Changed" Unchecked="Filter_Changed"/>
<CheckBox Content="需要审核" Margin="5" Checked="Filter_Changed" Unchecked="Filter_Changed"/>
WrapPanel>
<ListView Name="taskListView" Height="200" Margin="0,10,0,0">
ListView>
StackPanel>
<ScrollViewer Height="300">
<ItemsControl ItemsSource="{Binding LargeDataCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VirtualizationMode="Recycling"/>
ItemsPanelTemplate>
ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}"
IsChecked="{Binding IsSelected, Mode=TwoWay}"
Margin="5"/>
DataTemplate>
ItemsControl.ItemTemplate>
ItemsControl>
ScrollViewer>
当CheckBox的内容过长时,可以使用TextWrapping和MaxWidth控制:
<CheckBox Margin="5">
<TextBlock Text="这是一段很长的描述文本,需要进行换行显示以避免界面布局被破坏"
TextWrapping="Wrap"
MaxWidth="200"/>
CheckBox>
调整VerticalContentAlignment和HorizontalContentAlignment可以控制内容对齐:
<CheckBox VerticalContentAlignment="Center"
HorizontalContentAlignment="Left"
Content="居中对齐的选项"/>
CheckBox的事件可能会冒泡到父容器,可以通过处理Handled属性来控制事件传播:
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
// 处理逻辑
// ...
// 阻止事件继续传播
e.Handled = true;
}
CheckBox控件是WPF应用程序中不可或缺的UI元素,它简单易用,同时又非常灵活。通过本文的详细介绍,相信你已经掌握了:
在实际开发中,合理使用CheckBox可以大大提升应用程序的用户体验,让用户更直观地进行选择操作。