zoukankan      html  css  js  c++  java
  • WPF 自定义CheckBox样式

    自定义的CheckBox样式,mark一下,方便以后参考复用

    模板

    一般CheckBox模板太难看了,所以肯定要重写其中的模板ControlTemplate

    • 外边框 俩个Rectangle,用于定义复选框选中/未选中时的背景色和边框样式
    • 对勾√ 通过俩个path组合,并控制其显示,用于定义选中状态

    选中状态

    模板状态为未选中状态和选中状态,设置为默认未选中就好了。

    通过Trigger设置选中状态的样式显示

    复制代码
        <Style x:Key="CheckBoxStyle" TargetType="{x:Type CheckBox}">
            <Setter Property="SnapsToDevicePixels" Value="true" />
            <Setter Property="OverridesDefaultStyle" Value="False" />
            <Setter Property="FocusVisualStyle" Value="{DynamicResource CheckBoxFocusVisual}" />
            <Setter Property="Height" Value="25"/>
            <Setter Property="IsChecked" Value="False"/>
            <Setter Property="Margin" Value="0,20"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="CheckBox">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Grid Height="{TemplateBinding Height}" Width="{TemplateBinding Height}">
                                <Rectangle x:Name="CheckBoxRectangle" Fill="LightSkyBlue" Opacity="0.3" RadiusY="5" RadiusX="5"/>
                                <Rectangle x:Name="CheckBoxRectangleOut" Stroke="#FF06DAD1" StrokeThickness="1" RadiusY="5" RadiusX="5"/>
                                <Grid x:Name="CheckedMark" Width="20" Height="20" Visibility="Collapsed">
                                    <Path SnapsToDevicePixels="False" StrokeThickness="3" Data="M1,9 L10,17" Stroke="White"/>
                                    <Path SnapsToDevicePixels="False" StrokeThickness="3" Data="M8,17 L20,4" Stroke="White"/>
                                </Grid>
                            </Grid>
                            <TextBlock Grid.Column="1" Text="AAAA" FontSize="18" Foreground="White" VerticalAlignment="Center" Margin="14,0,0,0"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="True">
                                <Setter TargetName="CheckedMark" Property="Visibility" Value="Visible"></Setter>
                                <Setter TargetName="CheckBoxRectangle" Property="Fill" Value="#FF00A8E0"></Setter>
                                <Setter TargetName="CheckBoxRectangle" Property="Opacity" Value="1"></Setter>
                                <Setter TargetName="CheckBoxRectangleOut" Property="Stroke" Value="Transparent"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    复制代码

    当然如果需要点动画的话,可以添加个Strory,也是不错的。

    EventTrigger ,设置事件触发源如Click,Mouse.MouseEnter

    有意思的是HandoffBehavior 属性,其默认值 SnapshotAndReplace

    • SnapshotAndReplace 新动画将替换它们所应用到的属性上的任何现有动画 -- 即新动画立即替换原有动画
    • Compose 将通过把新动画追加到组合链的末尾来组合新动画和现有动画- - 即完成原有动画后,再执行新动画
    复制代码
        <Style x:Key="CheckBoxStyle" TargetType="{x:Type CheckBox}">
            <Setter Property="SnapsToDevicePixels" Value="true" />
            <Setter Property="OverridesDefaultStyle" Value="False" />
            <Setter Property="FocusVisualStyle" Value="{DynamicResource CheckBoxFocusVisual}" />
            <Setter Property="Height" Value="25"/>
                <Setter Property="IsChecked" Value="{Binding IsChecked}"/>
            <Setter Property="Margin" Value="0,20"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="CheckBox">
                        <Grid x:Name="aaaa">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Grid Height="{TemplateBinding Height}" Width="{TemplateBinding Height}">
                                <Rectangle x:Name="CheckBoxRectangle" Fill="LightSkyBlue" Opacity="0.3" RadiusY="5" RadiusX="5"/>
                                <Rectangle x:Name="CheckBoxRectangleOut" Stroke="#FF06DAD1" StrokeThickness="1" RadiusY="5" RadiusX="5"/>
                                    <Grid x:Name="CheckedMark" Width="20" Height="20" Visibility="Collapsed">
                                        <Path SnapsToDevicePixels="False" StrokeThickness="3" Data="M1,9 L10,17" Stroke="White"/>
                                        <Path SnapsToDevicePixels="False" StrokeThickness="3" Data="M8,17 L20,4" Stroke="White"/>
                                        <Grid.RenderTransform>
                                            <RotateTransform x:Name="CheckBoxTransform" Angle="0" CenterX="10" CenterY="10"></RotateTransform>
                                        </Grid.RenderTransform>
                                    </Grid>
                                </Grid>
                            <TextBlock Grid.Column="1" Text="{Binding Name}" FontSize="18" Foreground="White" VerticalAlignment="Center" Margin="14,0,0,0"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="True">
                                <Setter TargetName="CheckedMark" Property="Visibility" Value="Visible"></Setter>
                                <Setter TargetName="CheckBoxRectangle" Property="Fill" Value="#FF00A8E0"></Setter>
                                <Setter TargetName="CheckBoxRectangle" Property="Opacity" Value="1"></Setter>
                                <Setter TargetName="CheckBoxRectangleOut" Property="Stroke" Value="Transparent"></Setter>
                            </Trigger>
                            <EventTrigger RoutedEvent="Click">
                                <BeginStoryboard HandoffBehavior="SnapshotAndReplace">
                                    <Storyboard TargetName="CheckBoxTransform" TargetProperty="Angle">
                                        <DoubleAnimation From="0" To="360" Duration="0:0:0.1"></DoubleAnimation>
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    复制代码

    顺带可浏览下,CheckBox的布局显示

    关键字:CheckBox,HandoffBehavior

  • 相关阅读:
    CSS为英文和中文字体分别设置不同的字体
    进程控制之孤儿进程
    求解逻辑问题:谁养鱼
    2019-7-29-win10-uwp-如何使用DataTemplate
    2019-7-29-win10-uwp-如何使用DataTemplate
    2018-8-10-win10-uwp-修改Pivot-Header-颜色
    2018-8-10-win10-uwp-修改Pivot-Header-颜色
    2018-10-17-Sublime-Text-好用的插件
    2018-10-17-Sublime-Text-好用的插件
    2018-11-13-WPF-禁用实时触摸
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14744754.html
Copyright © 2011-2022 走看看