【c#】CheckBox
一、Style
1、style1
1.1 效果
1.2 代码
<Style x:Key="CheckBoxStyle" TargetType="{x:Type CheckBox}">
<Setter Property="FocusVisualStyle">
<Setter.Value>
<Style>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="2" SnapsToDevicePixels="True" Stroke="#2196f3" StrokeThickness="1" StrokeDashArray="1 2" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="White" />
<Setter Property="BorderBrush" Value="#cccccc" />
<Setter Property="Foreground" Value="#000" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<Grid x:Name="templateRoot" Background="Transparent" SnapsToDevicePixels="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Height="14" Width="14" x:Name="checkBoxBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="1" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" CornerRadius="3">
<Grid x:Name="markGrid">
<Path x:Name="optionMark" Data="F1M9.97498,1.22334L4.6983,9.09834 4.52164,9.09834 0,5.19331 1.27664,3.52165 4.255,6.08833 8.33331,1.52588E-05 9.97498,1.22334z"
Fill="#fff" Margin="1" Opacity="0" Stretch="None" />
<Rectangle x:Name="indeterminateMark" Fill="#FF212121" Margin="2" Opacity="0" />
</Grid>
</Border>
<ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Grid.Column="1"
ContentStringFormat="{TemplateBinding ContentStringFormat}" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="HasContent" Value="True">
<Setter Property="FocusVisualStyle">
<Setter.Value>
<Style>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="14,0,0,0" SnapsToDevicePixels="True" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1"
StrokeDashArray="1 2" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Padding" Value="4,-1,0,0" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" TargetName="checkBoxBorder" Value="#FFF3F9FF" />
<Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="#FF5593FF" />
<Setter Property="Fill" TargetName="optionMark" Value="#FF212121" />
<Setter Property="Fill" TargetName="indeterminateMark" Value="#FF212121" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" TargetName="checkBoxBorder" Value="#FFE6E6E6" />
<Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="#FFBCBCBC" />
<Setter Property="Fill" TargetName="optionMark" Value="#FF707070" />
<Setter Property="Fill" TargetName="indeterminateMark" Value="#FF707070" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" TargetName="checkBoxBorder" Value="#FFD9ECFF" />
<Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="#FF3C77DD" />
<Setter Property="Fill" TargetName="optionMark" Value="#FF212121" />
<Setter Property="Fill" TargetName="indeterminateMark" Value="#FF212121" />
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Opacity" TargetName="optionMark" Value="1" />
<Setter Property="Opacity" TargetName="indeterminateMark" Value="0" />
<Setter Property="Background" Value="#0064e6"/>
<Setter Property="BorderBrush" Value="#0064e6"/>
</Trigger>
<Trigger Property="IsChecked" Value="{x:Null}">
<Setter Property="Opacity" TargetName="optionMark" Value="0" />
<Setter Property="Opacity" TargetName="indeterminateMark" Value="1" />
<Setter Property="Background" Value="#FFF"/>
<Setter Property="BorderBrush" Value="#cccccc"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked" Value="True"></Condition>
<Condition Property="IsEnabled" Value="False"></Condition>
</MultiTrigger.Conditions>
<Setter Property="Background" Value="#e5e5e5"></Setter>
<Setter Property="BorderBrush" Value="#cccccc"></Setter>
<Setter Property="Fill" TargetName="optionMark" Value="#999999" />
<!--<Setter Property="Opacity" TargetName="optionMark" Value="0"></Setter>-->
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
二、功能实现
1、DataGrid添加一键全选CheckBox
1.1 xaml
<DataGridTemplateColumn Width="55*">
<!-- 一定要设置HeaderStyle -->
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Foreground" Value="#000" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="FontSize" Value="12" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Height" Value="25" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderThickness" Value="0"></Setter>
<Setter Property="BorderBrush" Value="#ddd"></Setter>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox x:Name="All_CheckBox" IsChecked="{Binding DataContext.AllChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type UserControl}}}" VerticalAlignment="Center" HorizontalAlignment="Center" Style="{DynamicResource CheckBoxStyle}" Click="All_CheckBox_Click"></CheckBox>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="Sub_CheckBox" Tag="{Binding UserId}" VerticalAlignment="Center" HorizontalAlignment="Center" Style="{DynamicResource CheckBoxStyle}" Checked="Sub_CheckBox_Checked" Unchecked="Sub_CheckBox_Unchecked"></CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
1.2 All_CheckBox_Click
private void All_CheckBox_Click(object sender, RoutedEventArgs e)
{
CheckBox headerCheckBox = sender as CheckBox;
if(headerCheckBox == null)
return;
//第一列checkBox模板列
DataGridTemplateColumn templeteColumn = grid.Columns[0] as DataGridTemplateColumn;
if(templeColumn == null)
return;
foreach(var item in grid.Items)//grid DataGrid
{
FrameworkElement frElement = templeteColumn.getCellContent(item);
if(frElement != null)
{
CheckBox subCheckBox = frElement.CellTemplete.FindName("Sub_CheckBox", frElement) as CheckBox;
if(subCheckBox !=null)
{
if(headerCheckBox.IsChecked == true)
{
subCheckBox.IsChecked = true;
SelectedSet.Add(long.Parse(subCheckBox.Tag.ToString()));//HashSet<T> 可以对选择项ids进一步进行操作
}
else
{
subCheckBox.IsChecked = false;
if(SelectedSet!=null && SelectedSet.Count>0)
SelectedSet.Clear();//清掉存储Set
}
}
}
}
}