欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解WPF如何把checkbox改成開關(guān)樣式

 更新時間:2024年11月29日 08:26:58   作者:BearHan  
這篇文章主要為大家詳細(xì)介紹了WPF如何把checkbox改成開關(guān)樣式,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下

先看一下效果吧:

isChecked = false 的時候的效果

isChecked = true 的時候的效果

 然后我們來實現(xiàn)一下這個效果吧

第一步:創(chuàng)建一個空的wpf項目;

第二步:在項目里面添加一個checkbox

<Grid>
        <CheckBox HorizontalAlignment="Center" IsChecked="True"
                  BorderBrush="Black" VerticalAlignment="Center" 
                  Content="switch" Background="#FF00ADFF"/>
    </Grid>

這個時候的checkbox的樣子是這樣的

 第三步:在頁面中右鍵checkbox,選擇  編輯模板 ,再  編輯副本, 之后確定

 vs就會給我們自動生成一個名為 ”CheckBoxStyle1” 的Checkbox的默認(rèn)樣式的代碼,我們通過修改默認(rèn)樣式的代碼,把普通的Checkbox變成一個開關(guān)。

 第四步:修改默認(rèn)樣式

<Grid x:Name="templateRoot" Background="Transparent" SnapsToDevicePixels="True">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Border x:Name="PART_Border" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" 
                                    BorderThickness="1" Height="14" Width="25" CornerRadius="5">
                                <Border x:Name="SwitchBorder" BorderThickness="1" BorderBrush="Gray" Background="White" Width="10" 
                                        Margin="1" CornerRadius="5" HorizontalAlignment="Right"/>
                            </Border>
                            <ContentPresenter x:Name="contentPresenter" Grid.Column="1" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                              Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Grid>

把之前的樣式代碼改成上面的代碼,trigger部分,把報錯的部分全部刪除

這個時候,我們的開關(guān)樣式就已經(jīng)完成了

 我們現(xiàn)在需要添加一些trigger和動畫來實現(xiàn)切換效果

第五步:添加動畫和trigger

<Storyboard x:Key="SwitchChecked">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="SwitchBorder" Storyboard.TargetProperty="(FrameworkElement.Width)">
        <EasingDoubleKeyFrame KeyTime="00:00:00" Value="10"/>
        <EasingDoubleKeyFrame KeyTime="00:00:00.2500000" Value="20"/>
        <EasingDoubleKeyFrame KeyTime="00:00:00.5000000" Value="10"/>
    </DoubleAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SwitchBorder" Storyboard.TargetProperty="(FrameworkElement.HorizontalAlignment)">
        <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static HorizontalAlignment.Left}"/>
        <DiscreteObjectKeyFrame KeyTime="00:00:00.2500000" Value="{x:Static HorizontalAlignment.Right}"/>
        <DiscreteObjectKeyFrame KeyTime="00:00:00.5000000" Value="{x:Static HorizontalAlignment.Right}"/>
    </ObjectAnimationUsingKeyFrames>
</Storyboard>

<Storyboard x:Key="SwitchUnchecked">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="SwitchBorder" Storyboard.TargetProperty="(FrameworkElement.Width)">
        <EasingDoubleKeyFrame KeyTime="00:00:00" Value="10"/>
        <EasingDoubleKeyFrame KeyTime="00:00:00.2500000" Value="20"/>
        <EasingDoubleKeyFrame KeyTime="00:00:00.5000000" Value="10"/>
    </DoubleAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SwitchBorder" Storyboard.TargetProperty="(FrameworkElement.HorizontalAlignment)">
        <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static HorizontalAlignment.Right}"/>
        <DiscreteObjectKeyFrame KeyTime="00:00:00.2500000" Value="{x:Static HorizontalAlignment.Left}"/>
        <DiscreteObjectKeyFrame KeyTime="00:00:00.5000000" Value="{x:Static HorizontalAlignment.Left}"/>
    </ObjectAnimationUsingKeyFrames>
</Storyboard>

上面這段代碼就是表示不同狀態(tài)下的不同動畫效果,通過改變SwitchBoder的寬度和對齊方式,就可以實現(xiàn)了

然后我們再把這段動畫效果運(yùn)用到模板中,再添加3個trigger,就可以了

<ControlTemplate.Triggers>
                            <Trigger Property="HasContent" Value="true">
                                <Setter Property="FocusVisualStyle" Value="{StaticResource OptionMarkFocusVisual}"/>
                                <Setter Property="Padding" Value="4,-1,0,0"/>
                            </Trigger>
                            <EventTrigger RoutedEvent="{x:Static CheckBox.CheckedEvent}">
                                <BeginStoryboard Storyboard="{StaticResource SwitchChecked}"/>
                            </EventTrigger>
                            <EventTrigger RoutedEvent="{x:Static CheckBox.UncheckedEvent}">
                                <BeginStoryboard Storyboard="{StaticResource SwitchUnchecked}"/>
                            </EventTrigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Background" TargetName="PART_Border" Value="{StaticResource OptionMark.Disabled.Background}"/>
                                <Setter Property="BorderBrush" TargetName="PART_Border" Value="{StaticResource OptionMark.Disabled.Border}"/>
                            </Trigger>
                            <Trigger Property="IsChecked" Value="False">
                                <Setter Property="Background" Value="White" TargetName="PART_Border"/>
                                <Setter Property="HorizontalAlignment" Value="Left" TargetName="SwitchBorder"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="BorderBrush" TargetName="PART_Border" Value="{StaticResource OptionMark.MouseOver.Border}"/>
                            </Trigger>

                        </ControlTemplate.Triggers>

到現(xiàn)在,樣式和動畫就已經(jīng)完成了,我們再把代碼全部剪切到App.xaml這個項目資源文件下面,再刪掉style的命名,x:Key="CheckBoxStyle1"刪掉,

這樣子我們的項目里面的checkbox就都是開關(guān)的樣式了,運(yùn)行項目也不會報錯啦,最后的代碼如下

<Application.Resources>

        <Storyboard x:Key="SwitchChecked">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="SwitchBorder" Storyboard.TargetProperty="(FrameworkElement.Width)">
                <EasingDoubleKeyFrame KeyTime="00:00:00" Value="10"/>
                <EasingDoubleKeyFrame KeyTime="00:00:00.2500000" Value="20"/>
                <EasingDoubleKeyFrame KeyTime="00:00:00.5000000" Value="10"/>
            </DoubleAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SwitchBorder" Storyboard.TargetProperty="(FrameworkElement.HorizontalAlignment)">
                <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static HorizontalAlignment.Left}"/>
                <DiscreteObjectKeyFrame KeyTime="00:00:00.2500000" Value="{x:Static HorizontalAlignment.Right}"/>
                <DiscreteObjectKeyFrame KeyTime="00:00:00.5000000" Value="{x:Static HorizontalAlignment.Right}"/>
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>

        <Storyboard x:Key="SwitchUnchecked">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="SwitchBorder" Storyboard.TargetProperty="(FrameworkElement.Width)">
                <EasingDoubleKeyFrame KeyTime="00:00:00" Value="10"/>
                <EasingDoubleKeyFrame KeyTime="00:00:00.2500000" Value="20"/>
                <EasingDoubleKeyFrame KeyTime="00:00:00.5000000" Value="10"/>
            </DoubleAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SwitchBorder" Storyboard.TargetProperty="(FrameworkElement.HorizontalAlignment)">
                <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static HorizontalAlignment.Right}"/>
                <DiscreteObjectKeyFrame KeyTime="00:00:00.2500000" Value="{x:Static HorizontalAlignment.Left}"/>
                <DiscreteObjectKeyFrame KeyTime="00:00:00.5000000" Value="{x:Static HorizontalAlignment.Left}"/>
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>


        <Style x:Key="FocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2" StrokeDashArray="1 2" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" SnapsToDevicePixels="true" StrokeThickness="1"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="OptionMarkFocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="14,0,0,0" StrokeDashArray="1 2" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" SnapsToDevicePixels="true" StrokeThickness="1"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <SolidColorBrush x:Key="OptionMark.Static.Background" Color="#FFFFFFFF"/>
        <SolidColorBrush x:Key="OptionMark.Static.Border" Color="#FF707070"/>
        <SolidColorBrush x:Key="OptionMark.Static.Glyph" Color="#FF212121"/>
        <SolidColorBrush x:Key="OptionMark.MouseOver.Background" Color="#FFF3F9FF"/>
        <SolidColorBrush x:Key="OptionMark.MouseOver.Border" Color="#FF5593FF"/>
        <SolidColorBrush x:Key="OptionMark.MouseOver.Glyph" Color="#FF212121"/>
        <SolidColorBrush x:Key="OptionMark.Pressed.Background" Color="#FFD9ECFF"/>
        <SolidColorBrush x:Key="OptionMark.Pressed.Border" Color="#FF3C77DD"/>
        <SolidColorBrush x:Key="OptionMark.Pressed.Glyph" Color="#FF212121"/>
        <SolidColorBrush x:Key="OptionMark.Disabled.Background" Color="#FFE6E6E6"/>
        <SolidColorBrush x:Key="OptionMark.Disabled.Border" Color="#FFBCBCBC"/>
        <SolidColorBrush x:Key="OptionMark.Disabled.Glyph" Color="#FF707070"/>
        <Style TargetType="{x:Type CheckBox}">
            <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
            <Setter Property="Background" Value="{StaticResource OptionMark.Static.Background}"/>
            <Setter Property="BorderBrush" Value="{StaticResource OptionMark.Static.Border}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <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 x:Name="PART_Border" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" 
                                    BorderThickness="1" Height="14" Width="25" CornerRadius="5">
                                <Border x:Name="SwitchBorder" BorderThickness="1" BorderBrush="Gray" Background="White" Width="10" 
                                        Margin="1" CornerRadius="5" HorizontalAlignment="Right"/>
                            </Border>
                            <ContentPresenter x:Name="contentPresenter" Grid.Column="1" 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" Value="{StaticResource OptionMarkFocusVisual}"/>
                                <Setter Property="Padding" Value="4,-1,0,0"/>
                            </Trigger>
                            <EventTrigger RoutedEvent="{x:Static CheckBox.CheckedEvent}">
                                <BeginStoryboard Storyboard="{StaticResource SwitchChecked}"/>
                            </EventTrigger>
                            <EventTrigger RoutedEvent="{x:Static CheckBox.UncheckedEvent}">
                                <BeginStoryboard Storyboard="{StaticResource SwitchUnchecked}"/>
                            </EventTrigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Background" TargetName="PART_Border" Value="{StaticResource OptionMark.Disabled.Background}"/>
                                <Setter Property="BorderBrush" TargetName="PART_Border" Value="{StaticResource OptionMark.Disabled.Border}"/>
                            </Trigger>
                            <Trigger Property="IsChecked" Value="False">
                                <Setter Property="Background" Value="White" TargetName="PART_Border"/>
                                <Setter Property="HorizontalAlignment" Value="Left" TargetName="SwitchBorder"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="BorderBrush" TargetName="PART_Border" Value="{StaticResource OptionMark.MouseOver.Border}"/>
                            </Trigger>

                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        
    </Application.Resources>

到此這篇關(guān)于詳解WPF如何把checkbox改成開關(guān)樣式的文章就介紹到這了,更多相關(guān)WPF把checkbox改成開關(guān)樣式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • C#設(shè)置文件權(quán)限的方法

    C#設(shè)置文件權(quán)限的方法

    這篇文章主要介紹了C#設(shè)置文件權(quán)限的方法,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-08-08
  • C#使用Sleep(Int32)方法實現(xiàn)動態(tài)顯示時間

    C#使用Sleep(Int32)方法實現(xiàn)動態(tài)顯示時間

    這篇文章主要為大家詳細(xì)介紹了C#如何使用Sleep(Int32)方法實現(xiàn)動態(tài)顯示時間,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考下
    2024-01-01
  • C#中隱藏TabControl選項卡標(biāo)簽的解決方案

    C#中隱藏TabControl選項卡標(biāo)簽的解決方案

    這篇文章主要介紹了C#中隱藏TabControl選項卡標(biāo)簽的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 深入分析C# 線程同步

    深入分析C# 線程同步

    這篇文章主要介紹了C# 線程同步的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C# Winform中DataGridView導(dǎo)出為Excel的實現(xiàn)示例

    C# Winform中DataGridView導(dǎo)出為Excel的實現(xiàn)示例

    本文主要介紹了C# Winform中DataGridView導(dǎo)出為Excel的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C# 添加、修改和刪除PDF書簽的實例代碼

    C# 添加、修改和刪除PDF書簽的實例代碼

    本篇文章主要介紹了C# 添加、修改和刪除PDF書簽的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • C# 忽略大小寫進(jìn)行字符串比較

    C# 忽略大小寫進(jìn)行字符串比較

    這篇文章主要介紹了C# 字符串比較忽略大小寫的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • c++ STL之list對結(jié)構(gòu)體的增加,刪除,排序等操作詳解

    c++ STL之list對結(jié)構(gòu)體的增加,刪除,排序等操作詳解

    這篇文章主要介紹了c++ STL之list對結(jié)構(gòu)體的增加,刪除,排序等操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C# 開發(fā)(創(chuàng)藍(lán)253)手機(jī)短信驗證碼接口的實例

    C# 開發(fā)(創(chuàng)藍(lán)253)手機(jī)短信驗證碼接口的實例

    下面小編就為大家分享一篇C# 開發(fā)(創(chuàng)藍(lán)253)手機(jī)短信驗證碼接口的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • C#遍歷DataSet控件實例總結(jié)

    C#遍歷DataSet控件實例總結(jié)

    這篇文章主要介紹了C#遍歷DataSet控件的用法,以實例形式總結(jié)歸納了常見的遍歷方法,具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2014-10-10

最新評論