詳解WPF如何把checkbox改成開(kāi)關(guān)樣式
先看一下效果吧:
isChecked = false 的時(shí)候的效果
isChecked = true 的時(shí)候的效果
然后我們來(lái)實(shí)現(xiàn)一下這個(gè)效果吧
第一步:創(chuàng)建一個(gè)空的wpf項(xiàng)目;
第二步:在項(xiàng)目里面添加一個(gè)checkbox
<Grid> <CheckBox HorizontalAlignment="Center" IsChecked="True" BorderBrush="Black" VerticalAlignment="Center" Content="switch" Background="#FF00ADFF"/> </Grid>
這個(gè)時(shí)候的checkbox的樣子是這樣的
第三步:在頁(yè)面中右鍵checkbox,選擇 編輯模板 ,再 編輯副本, 之后確定
vs就會(huì)給我們自動(dòng)生成一個(gè)名為 ”CheckBoxStyle1” 的Checkbox的默認(rèn)樣式的代碼,我們通過(guò)修改默認(rèn)樣式的代碼,把普通的Checkbox變成一個(gè)開(kāi)關(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部分,把報(bào)錯(cuò)的部分全部刪除
這個(gè)時(shí)候,我們的開(kāi)關(guān)樣式就已經(jīng)完成了
我們現(xiàn)在需要添加一些trigger和動(dòng)畫(huà)來(lái)實(shí)現(xiàn)切換效果
第五步:添加動(dòng)畫(huà)和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)下的不同動(dòng)畫(huà)效果,通過(guò)改變SwitchBoder的寬度和對(duì)齊方式,就可以實(shí)現(xiàn)了
然后我們?cè)侔堰@段動(dòng)畫(huà)效果運(yùn)用到模板中,再添加3個(gè)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)在,樣式和動(dòng)畫(huà)就已經(jīng)完成了,我們?cè)侔汛a全部剪切到App.xaml這個(gè)項(xiàng)目資源文件下面,再刪掉style的命名,x:Key="CheckBoxStyle1"刪掉,
這樣子我們的項(xiàng)目里面的checkbox就都是開(kāi)關(guān)的樣式了,運(yùn)行項(xiàng)目也不會(huì)報(bào)錯(cuò)啦,最后的代碼如下
<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改成開(kāi)關(guān)樣式的文章就介紹到這了,更多相關(guān)WPF把checkbox改成開(kāi)關(guān)樣式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用Sleep(Int32)方法實(shí)現(xiàn)動(dòng)態(tài)顯示時(shí)間
這篇文章主要為大家詳細(xì)介紹了C#如何使用Sleep(Int32)方法實(shí)現(xiàn)動(dòng)態(tài)顯示時(shí)間,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2024-01-01C#中隱藏TabControl選項(xiàng)卡標(biāo)簽的解決方案
這篇文章主要介紹了C#中隱藏TabControl選項(xiàng)卡標(biāo)簽的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04C# Winform中DataGridView導(dǎo)出為Excel的實(shí)現(xiàn)示例
本文主要介紹了C# Winform中DataGridView導(dǎo)出為Excel的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05C# 添加、修改和刪除PDF書(shū)簽的實(shí)例代碼
本篇文章主要介紹了C# 添加、修改和刪除PDF書(shū)簽的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07c++ STL之list對(duì)結(jié)構(gòu)體的增加,刪除,排序等操作詳解
這篇文章主要介紹了c++ STL之list對(duì)結(jié)構(gòu)體的增加,刪除,排序等操作詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12C# 開(kāi)發(fā)(創(chuàng)藍(lán)253)手機(jī)短信驗(yàn)證碼接口的實(shí)例
下面小編就為大家分享一篇C# 開(kāi)發(fā)(創(chuàng)藍(lán)253)手機(jī)短信驗(yàn)證碼接口的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01