WPF自定义控件05:ToggleButton

在不少的手机端应用程序中,经常可以看到一些开关按钮,它可以非常方便的进行状态的切换操作。本文将介绍一下自定义的开关按钮ToggleButton,它与FlatCheckBox实现过程非常类似,它也是继承自CheckBox。下面将详c#多线程细介绍具体的实现细节。

1 WPc#怎么读F项c#多线程目结构

基于之前创建的WPF示例项目,在其中创建一些新的关于ToggleButton的项目文件。本质上,ToggleBc#utton是继承CheckBoc#面试题x控件,利用CheckBox控件的自身的属性和方法,可c#怎么读以减少自己实现的难度和复杂度。另外,通过自定义Style实现的Flat UI效果的ToggleButton。具体的项目结构如下图所示:

WPF自定义控件05:ToggleButton

其中的Fonts目录下存放各种图标字体文件,c#Style目录下存放各种控件的UI 样式c#多线程定义文件,ToggleButton.xaml就是ToggleButton控件的样式定义文件。另外,需要将其注册c#为什么用的人很少到Generic.xaml文件中。c#是什么意思

2 WPFToggleButton实现

首先在c#和c++区别Yd.WpfContc#rols项目中添加一个类ToggleButton.cs,它继承自CheckBox控件,示例代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Medc#是什么语言ia;
namespace Yd.WpfControls
{c#面试题
    public classc#和c++区别 ToggleButton : CheckBox
    {
        static Togglec#Button()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(Toc#是什么语言ggleButton),
                new FrameworkPropertyMetadata(typeof(ToggleButton)));
        }
        public static readonly DependencyProperty OffTextPc#委托ropertc#y =
            DependencyProperty.Register("OffText", typeof(string), typeof(ToggleButton),
                new Propc#是什么意思ertyMetadata("Off"));
        public string OffText
        {
            get { rec#教程turn (string)GetValue(OffTextProperty); }
            set { SetValue(OffTextProperty, valuec#是什么语言); }
        }
        public static readonly Depec#是什么ndencyProperty OnTextProperty =
            DependencyPropertyc#为什么用的人很少.Register("OnText", typec#是什么意思of(string), typeof(c#为什么用的人很少ToggleButton),
                new PropertyMetadata("On"));
        public sc#多线程tring OnText
        {
            get { return (string)GetValue(OnTextProperty);c#面试题 }
            set { SetValue(OnTextProperty,c#和c++区别 vac#委托lue); }
        }
        public static readonly DependencyProperty OnForegroundPropc#委托erty =
            DependencyProperty.Register("OnForeground", typeof(Brush)c#是什么, typeof(ToggleButton),
                new PropertyMetadata(Brushes.Silver));
        public Brush Onc#为什么用的人很少Foregrounc#和c++区别d
        {
            get { return (Brush)Getc#委托Value(OnForegroundProperty); }
            set { SetValue(OnForegroundProperty, value); }
        }
        public static readonly Dependc#是什么encyProperty OnBackgroundProperty =
            DependencyProperty.Register("OnBackground", typeof(Brush), typeof(ToggleButton),
                new PropertyMetadata(Brushes.Green));
        public Brush OnBackground
        {
            get { return (Brush)GetValue(OnBackgroundProperty); }
            set { SetValue(OnBackgroundProperty,c#怎么读 value); }
        }
    }
}

其中定义了几个属性,特别c#和c++区别是OnText和OffText,它们分别代表开关控件在打开状态的文本和关闭状态的文本。默认情况下,OnText文本是On,而OffText文本是Off。另外OnBackground是打开状态下的背景色,OnForeground是打开状态下的字体颜色。ToggleButton控件的UI样式主要就是依靠ToggleButton.xaml文件进行定义的,示例代码c#是什么语言如下:

<ResourceDictionary xmc#是什么意思lns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http:/c#面试题/schemas.microsoft.coc#为什么用的人很少m/winfx/2006/xc#aml"
                    xmlns:local="c#怎么读clr-namespace:Yd.WpfControls"
                    >
    <Resoc#是什么语言urceDictionary.MergedDictionaries>
        <ResourceDic#怎么读ctionary  Source="/Yd.WpfCoc#教程nc#和c++区别trols;component/Style/IconFont.xaml"/>
    </ResourceDictionary.MergedDictionaries>
    <Style TargetTyc#多线程pe="{x:Type local:ToggleButton}">
        <Setter Property="Background" Value="{x:Static local:FlatColors.PETER_RIVER}"></Setter>
        <Sec#是什么意思tter Proc#是什么perty="Foregroundc#为什么用的人很少" Value="#DDE8E1"></Setter>
        <Sc#是什么意思etter Property="OnForeground" Vac#多线程lue="{x:Static local:FlatColors.EMERALD}"></Setter>
        <Setter Property="OnBackground" Value="{x:Static local:FlatColors.BELIZc#为什么用的人很少E_HOLE}"></Setter>
        <Setter Property="Fc#是什么语言ontSize"c#委托 Value="{x:Static local:FlatFonts.contentFoc#多线程ntSize}"/>
        <Setter Property="FontFamily" Valc#为什么用的人很少ue="{x:Static local:FlatFonts.contentFontFamily}"/>
        <Setter Property="Cursor" Value="Hand"></Setter>
        <Sc#教程etter Properc#是什么语言ty="Width" Valuc#教程e="75"></Setter>
        <Setter Property="Height" Value="28">&lc#t;/Setter>
        <Setter Property="VerticalAlignment"c#是什么 Value="Centec#和c++区别r"></Setc#多线程ter>
        <Setter Property="HorizontalAlignmc#教程ent" Value="Center"></Setter>
        <Sec#为什么用的人很少tter Propec#是什么意思rty="Template">
            <Sc#是什么语言etter.Value>c#怎么读
                <!--控件模板-->
                <c#是什么语言;ControlTemplate TargetType="{x:Type local:ToggleButton}">
                    <Grid x:Name="grid"  VerticalAlignc#和c++区别ment="Centc#委托er" >
                        <Border x:Name="border" Width="75" Height="28"
                                Background="{TemplateBinding Background}" Snac#为什么用的人很少psToDevicePixels="True"
                                Margin="0,0,0,0" CornerRadius="1c#委托4" Cursor="Hand">
                            <StackPanel Orientatc#是什么意思ionc#是什么意思="Horizontal">
                                <!--圆形-->
                                <Border x:Name="state" Width="24" Heighc#怎么读t="24" Margin="3,2,1,2c#" CornerRadiusc#是什么语言=c#为什么用的人很少"12" SnapsToDevicePixels="True"
                                    Background="{TemplateBinding Foreground}">
                                    <Border.RenderTransform>
                                        <Tc#多线程ranslateTransform x:Name="tc#多线程ransState" X="0"></TranslateTransform>
                                    <c#面试题;/c#多线程Border.Renc#委托derTransform>
                                </Border>
                                <!--文本-->
                                <TextBlock Width="40" Foreground="{TemplateBinding Foreground}" x:Namc#e="text"
                                           FontFamic#委托ly="{TemplateBindc#教程ing FontFamily}"
                                           FontSizc#e="{TemplateBinding FontSize}"
                                           Text="{TemplateBinding OffText}" VerticalAlignment="c#是什么意思Center"
                                           TextAlignmc#是什么语言ent="Center" Cursorc#和c++区别="Hand">
                                    <TextBlock.RenderTransfoc#教程rm>
                                        <TranslateTransform x:Name="transText" X="c#是什么语言0"></TranslateTransform>
                                    </TextBlock.RenderTransform>
                                </TextBlock>
                            </StackPanel>
                        </Border>
                    </Grid>
                    <!--c#多线程触发器,切换有动画-->
                    <ControlTemplc#怎么读ate.Triggers>
                        <Triggec#多线程r Property="IsChecked" Value="True">
                            <Setter Property="Text" Value="{Binding RelativeSource={RelativeSource Mode=Templatec#为什么用的人很少dParent}, Path=OnText}" Targec#教程tName=c#为什么用的人很少"text"/>
                            <Setter Property="Backgroc#怎么读unc#委托d" Value="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=OnForeground}" TargetName="state"/>
                            <c#和c++区别Setter Property="Foreground" Value="{Binc#和c++区别ding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=OnForeground}" Tarc#是什么意思getName="text"/>
                            <Setter Properc#ty="Background" Value="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=OnBackground}" TargetName="border"/>
                            <Trigger.EnterAc#是什么意思ctioc#ns>
                                <c#为什么用的人很少BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetName="trc#ansState" Storyboard.TargetProperty="X" To=c#多线程"46" Duration="0:0:0.3" />
                                        <DoubleAnimation Storybc#是什么oard.TargetName="transText" Storyboard.TargetProperty="X" To="-25" Duration="0:0:0.3" />
                                    </Storyboard>
                                </BeginStoryboard>
                            &lc#面试题t;/Trigger.EnterActions>
                            <Trigger.ExitActions>
                                <BeginStoryboard>
                                    <Storyc#是什么语言board>
                                        <DoubleAnimation Storyboard.TargetName="tc#和c++区别ransState" Storyboard.Targc#委托etProperty="X" To="0" Duration="0:0:0.3" />
                                        <DoubleAnimation Storyboard.TargetName="transText" Storyboard.TargetProperty="X" To="0" Duration="0:0:0.3" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </Trigger.ExitActions&c#是什么语言gt;
                        &c#lt;/Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Settec#是什么r Property="Opacity" Value="0.5" TargetName="border"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Settec#为什么用的人很少r.Valuec#多线程>
        </Setter>
    &c#是什么语言lt;/Style>
</ResourceDictionary>

通过触发器Triggerc#委托来确定ToggleButton属性IsChecked变化时,如何c#是什么在UI上进行显示,比如是打开状态,属性IsCheckec#d的值为true时,则会触发如下触发器定义的规则,其中关于tc#是什么意思ransStatc#和c++区别e控件元素沿着X轴往c#为什么用的人很少右边移动46,而文本transText则沿着X轴往左边移动25。

3 WPF ToggleButton测试

首先,需要重新生成一下项目文件,然后在WpfControls项目中添加自定义控件ToggleBuc#委托tton,MainWindow.xaml部分示例代码如下:

<WpfControls:ToggleButton Content="c#多线程SwitchCheckBox"c#是什么 HorizontalAlc#委托ignmenc#面试题t="Left"
                                  Margin="120,167,0,0" VerticalAlignmenc#委托t="Top"/>
<c#教程WpfControls:ToggleBc#教程utc#委托ton Content="SwitchChec#为什么用的人很少ckBox"  OnText="开" Ofc#怎么读fTexc#t="关"
                                    HorizontalAlignment="Left" Margin="286,167,0,0"
                                  VerticalAlignment="Topc#多线程"/>

运行界面如下:

WPF自定义控件05:ToggleButton