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

  • 相关阅读:
    OnEraseBkgnd、OnPaint与画面重绘
    .编译ADO类DLL时报错的解决方案
    VC列表框样式
    Codeforces 131D. Subway 寻找环树的最短路径
    Codeforces 103B. Cthulhu 寻找奈亚子
    Codeforces 246D. Colorful Graph
    Codeforces 278C. Learning Languages 图的遍历
    Codeforces 217A. Ice Skating 搜索
    Codeforces 107A. Dorm Water Supply 搜图
    Codeforces 263 D. Cycle in Graph 环
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14744754.html
Copyright © 2011-2022 走看看