C# WPF 自定义控件 滑块控件 开关控件 ToggleButton Switcher

2023-10-10 03:30

本文主要是介绍C# WPF 自定义控件 滑块控件 开关控件 ToggleButton Switcher,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

滑块效果演示如图:

 源码下载地址

https://download.csdn.net/download/shizu11zz/86934041icon-default.png?t=M85Bhttps://download.csdn.net/download/shizu11zz/86934041

直接贴源码,有帮助的话求点个赞,不过分吧:

【MainWindow.Xaml】

<Windowxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WPF_Test2"x:Class="WPF_Test2.MainWindow"mc:Ignorable="d" x:Name="mwindow"Title="MainWindow" Height="350" Width="525" Background="LightBlue"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="1*"/><ColumnDefinition Width="1*"/></Grid.ColumnDefinitions><local:Switcher Grid.Column="0" /><local:Switcher Grid.Column="1" Height="60" Width="160" FontSize="28" Foreground="Red" IsChecked="True"BorderThickness="1" BorderBrush="Yellow" CheckedTip=" 开"  UncheckedTip="关 "BallColor="Red" Checked="sw_Checked" Unchecked="sw_Unchecked"/></Grid>
</Window>

【 Generic.Xaml】

<ResourceDictionary   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WPF_Test2"><local:HeightCornerRadiusConverter x:Key="hcrConverter"/><local:CheckedToHidenConvert x:Key="CheckedToHidenConvert"/><local:CheckedToVisbilityConvert x:Key="CheckedToVisbilityConvert"/><Style x:Name="SwitcherStyle" TargetType="{x:Type local:Switcher}"><Setter Property="Height" Value="40"/><Setter Property="Width" Value="90"/><Setter Property="FontSize" Value="18"/><Setter Property="Foreground" Value="White"/><Setter Property="BorderThickness" Value="2"/><Setter Property="BorderBrush" Value="White"/><Setter Property="Background" Value="#ff212c7e"/><Setter Property="IsChecked" Value="True"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type local:Switcher}"><Border x:Name="bd1" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="{TemplateBinding ActualHeight ,Converter={StaticResource hcrConverter}}" Background="{TemplateBinding Background}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="1"><Grid x:Name="gd1"><Ellipse x:Name="e1" Grid.Column="0" Fill="{TemplateBinding BallColor}" Width="{Binding ActualHeight, RelativeSource={RelativeSource Mode=Self}}"Panel.ZIndex="1" Grid.ColumnSpan="2"><UIElement.RenderTransform><TranslateTransform X="0" x:Name="trans"/></UIElement.RenderTransform><Ellipse.Style><Style TargetType="Ellipse"><Setter Property="Margin" Value="0,3"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Margin" Value="0,2"/></Trigger></Style.Triggers></Style></Ellipse.Style></Ellipse><TextBlock x:Name="cTip" Margin="4,2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="{TemplateBinding CheckedTip}" Visibility="{TemplateBinding IsChecked,Converter={StaticResource CheckedToHidenConvert}}"/><TextBlock x:Name="unTip" Margin="4,2" VerticalAlignment="Center" HorizontalAlignment="Right" Text="{TemplateBinding UncheckedTip}" Visibility="{TemplateBinding IsChecked,Converter={StaticResource CheckedToVisbilityConvert}}"/></Grid></Border><ControlTemplate.Triggers><MultiTrigger><MultiTrigger.Conditions><Condition Property="IsMouseOver"  Value="True"/><Condition Property="IsChecked" Value="False"/></MultiTrigger.Conditions><MultiTrigger.Setters><Setter Property="Background" Value="LightGray"/></MultiTrigger.Setters></MultiTrigger><MultiTrigger><MultiTrigger.Conditions><Condition Property="IsMouseOver" Value="True"/><Condition Property="IsChecked" Value="True"/></MultiTrigger.Conditions><MultiTrigger.Setters><Setter Property="Background" Value="#ff546ab3"/></MultiTrigger.Setters></MultiTrigger><MultiTrigger><MultiTrigger.Conditions><Condition Property="IsMouseOver"  Value="False"/><Condition Property="IsChecked" Value="False"/></MultiTrigger.Conditions><MultiTrigger.Setters><Setter Property="Background" Value="Gray"/></MultiTrigger.Setters></MultiTrigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style>
</ResourceDictionary>

【Switcher.cs】

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Media.Animation;namespace WPF_Test2
{public class Switcher : ToggleButton{private System.Windows.Media.TranslateTransform ballMoveX;static Switcher(){DefaultStyleKeyProperty.OverrideMetadata(typeof(Switcher), new FrameworkPropertyMetadata(typeof(Switcher)));}#region Propdppublic static readonly DependencyProperty CheckedTipProperty =DependencyProperty.Register("CheckedTip", typeof(string), typeof(Switcher), new PropertyMetadata("ON"));public static readonly DependencyProperty UncheckedTipProperty =DependencyProperty.Register("UncheckedTip", typeof(string), typeof(Switcher), new PropertyMetadata("OFF"));public static readonly DependencyProperty BallColorProperty =DependencyProperty.Register("BallColor", typeof(Brush), typeof(Switcher), new PropertyMetadata(new SolidColorBrush(Colors.White)));public string CheckedTip{get { return (string)GetValue(CheckedTipProperty); }set { SetValue(CheckedTipProperty, value); }}public string UncheckedTip{get { return (string)GetValue(UncheckedTipProperty); }set { SetValue(UncheckedTipProperty, value); }}public Brush BallColor{get { return (Brush)GetValue(BallColorProperty); }set { SetValue(BallColorProperty, value); }}#endregionpublic Switcher() : base(){Checked += CheckedAnimation;Unchecked += UncheckedAnimation;Loaded += (e, s) =>{ballMoveX = ((Switcher)e).GetTemplateChild("trans") as System.Windows.Media.TranslateTransform;if (IsChecked != null) ballMoveX.X = (IsChecked == true ? -1 : 1) * (ActualWidth - ActualHeight) / 2;};}#region AnimationsDoubleAnimation ballAnima = new DoubleAnimation(0, new Duration(new TimeSpan(0, 0, 0, 0, 300))){EasingFunction = new CubicEase() { EasingMode = System.Windows.Media.Animation.EasingMode.EaseInOut }};private void CheckedAnimation(object sender, RoutedEventArgs e){if (!IsLoaded) e.Handled = true;//未初始化成功时,不向外传递Checked事件if (ballMoveX == null) return;ballAnima.To = -(ActualWidth - ActualHeight) / 2;ballMoveX.BeginAnimation(System.Windows.Media.TranslateTransform.XProperty, ballAnima);}private void UncheckedAnimation(object sender, RoutedEventArgs e){if (!IsLoaded) e.Handled = true;//未初始化成功时,不向外传递Unchecked事件if (ballMoveX == null) return;ballAnima.To = (ActualWidth - ActualHeight) / 2;ballMoveX.BeginAnimation(System.Windows.Media.TranslateTransform.XProperty, ballAnima);}#endregion}#region Converters/// <summary>/// 根据控件高度设置控件圆角半径/// 圆角半径为高度的二分之一/// </summary>public class HeightCornerRadiusConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){return 0.5 * int.Parse(value.ToString());}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotImplementedException();}}/// <summary>/// 当Ischecked=True时,/// 隐藏CheckedTip文本/// </summary>public class CheckedToVisbilityConvert : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value == null) return Visibility.Hidden;return (bool)value ? Visibility.Visible : Visibility.Hidden;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotImplementedException();}}/// <summary>/// 当Ischecked=False时,/// 隐藏UncheckedTip文本/// </summary>public class CheckedToHidenConvert : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value == null) return Visibility.Hidden;return (bool)value ? Visibility.Hidden : Visibility.Visible;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotImplementedException();}}#endregion
}

这篇关于C# WPF 自定义控件 滑块控件 开关控件 ToggleButton Switcher的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/177626

相关文章

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

C#中SortedSet的具体使用

《C#中SortedSet的具体使用》SortedSet是.NETFramework4.0引入的一个泛型集合类,它实现了一个自动排序的集合,内部使用红黑树数据结构来维护元素的有序性,下面就来介绍一下如... 目录基础概念主要特性创建和初始化基本创建方式自定义比较器基本操作添加和删除元素查询操作范围查询集合运

C# Opacity 不透明度的具体使用

《C#Opacity不透明度的具体使用》本文主要介绍了C#Opacity不透明度的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录WinFormsOpacity以下是一些使用Opacity属性的示例:设置窗体的透明度:设置按钮的透

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm