基于WPF实现控件轮廓跑马灯动画效果
作者:驚鏵 发布时间:2022-05-03 20:10:08
标签:WPF,控件,轮廓,跑马灯,动画
代码如下
一、创建EdgeLight.xaml代码如下。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:WPFDevelopers.Controls">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Basic/ControlBasic.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type controls:EdgeLight}" BasedOn="{StaticResource ControlBasicStyle}">
<Setter Property="BorderBrush" Value="{DynamicResource PrimaryNormalSolidColorBrush}"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Padding" Value="20"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:EdgeLight}">
<ControlTemplate.Resources>
<Storyboard x:Key="EdgeLightStoryboard">
<DoubleAnimation Duration="00:00:0.5"
To="1"
Storyboard.TargetName="PART_Top"
Storyboard.TargetProperty="ScaleX"/>
<DoubleAnimation Duration="00:00:0.5"
BeginTime="00:00:0.5"
To="1"
Storyboard.TargetName="PART_Right"
Storyboard.TargetProperty="ScaleY"/>
<DoubleAnimation Duration="00:00:.5"
BeginTime="00:00:01"
To="1"
Storyboard.TargetName="PART_Bottom"
Storyboard.TargetProperty="ScaleX"/>
<DoubleAnimation Duration="00:00:.5"
BeginTime="00:00:01.5"
To="1"
Storyboard.TargetName="PART_Left"
Storyboard.TargetProperty="ScaleY"/>
</Storyboard>
</ControlTemplate.Resources>
<Grid>
<DockPanel LastChildFill="False">
<Rectangle DockPanel.Dock="Top" Height="{TemplateBinding LineSize}" Fill="{TemplateBinding BorderBrush}">
<Rectangle.RenderTransform>
<ScaleTransform x:Name="PART_Top" ScaleX="0"/>
</Rectangle.RenderTransform>
</Rectangle>
<Rectangle DockPanel.Dock="Right" Width="{TemplateBinding LineSize}" Fill="{TemplateBinding BorderBrush}">
<Rectangle.RenderTransform>
<ScaleTransform x:Name="PART_Right" ScaleY="0"/>
</Rectangle.RenderTransform>
</Rectangle>
<Rectangle DockPanel.Dock="Bottom" Height="{TemplateBinding LineSize}" Fill="{TemplateBinding BorderBrush}"
RenderTransformOrigin="1,1">
<Rectangle.RenderTransform>
<ScaleTransform x:Name="PART_Bottom" ScaleX="0"/>
</Rectangle.RenderTransform>
</Rectangle>
<Rectangle DockPanel.Dock="Left" Width="{TemplateBinding LineSize}" Fill="{TemplateBinding BorderBrush}"
RenderTransformOrigin="1,1">
<Rectangle.RenderTransform>
<ScaleTransform x:Name="PART_Left" ScaleY="0"/>
</Rectangle.RenderTransform>
</Rectangle>
</DockPanel>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsAnimation" Value="True">
<Trigger.EnterActions>
<BeginStoryboard x:Name="beginAnimation"
Storyboard="{StaticResource EdgeLightStoryboard}" />
</Trigger.EnterActions>
<Trigger.ExitActions>
<StopStoryboard BeginStoryboardName="beginAnimation" />
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
二、EdgeLight.cs代码如下。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace WPFDevelopers.Controls
{
public class EdgeLight:ContentControl
{
public bool IsAnimation
{
get { return (bool)GetValue(IsAnimationProperty); }
set { SetValue(IsAnimationProperty, value); }
}
public static readonly DependencyProperty IsAnimationProperty =
DependencyProperty.Register("IsAnimation", typeof(bool), typeof(EdgeLight), new PropertyMetadata(false));
public double LineSize
{
get { return (double)GetValue(LineSizeProperty); }
set { SetValue(LineSizeProperty, value); }
}
public static readonly DependencyProperty LineSizeProperty =
DependencyProperty.Register("LineSize", typeof(double), typeof(EdgeLight), new PropertyMetadata(1.0d));
static EdgeLight()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(EdgeLight), new FrameworkPropertyMetadata(typeof(EdgeLight)));
}
}
}
三、新建EdgeLightExample.cs代码如下。
<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.EdgeLightExample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"
xmlns:wpfdev="https://github.com/yanjinhuagood/WPFDevelopers"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<UniformGrid Columns="2">
<wpfdev:EdgeLight IsAnimation="{Binding ElementName=myCheckBox,Path=IsChecked}" Margin="10" LineSize="2">
<CheckBox Content="EdgeLight" x:Name="myCheckBox"/>
</wpfdev:EdgeLight>
<wpfdev:EdgeLight IsAnimation="{Binding ElementName=myToggleButton,Path=IsChecked}" Margin="10"
BorderBrush="OrangeRed" LineSize="4">
<ToggleButton Content="EdgeLight2" x:Name="myToggleButton"/>
</wpfdev:EdgeLight>
</UniformGrid>
</Grid>
</UserControl>
效果预览
来源:https://mp.weixin.qq.com/s/_OPUZAR3CiNp8WSkZU7kog


猜你喜欢
- 分组类控件主要包括容器控件(Panel),分组框控件(groupBox)和选项卡控件(TabControl)等控件。一、Panel控件Pan
- 首页在AndroidManifest.xml中添加访问数据库权限<uses-sdk android:minSdkVersion=&qu
- 之前做了一个小的应用程序,用的是c#语言,涉及到了多线程的多参数传递,经过查找资料总结了一下解决方案!第一种解决方案的原理是:将线程执行的方
- 本文实例讲述了C#多线程之Thread中Thread.Join()函数用法。分享给大家供大家参考。具体分析如下:Thread.Join()在
- 简介Maven为我们封装了很多构建中非常有用的操作,我们只需要执行简单的几个mvn命令即可。今天我们要讨论一下mvn命令之下的生命周期的构建
- 最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人。目录结构:Ch
- 1、反射的概念1、概念反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法。这种
- 至少有K个重复字符的最长子串给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不
- 目录数据类型布尔类型字符串类型String拼接字符'+'转义字符运算符加减乘除模运算增量赋值运算符自增运算符和自建运算符赋值
- 一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响
- 概念介绍不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。01. 强引用这个就
- Web.Config,其中一部分配置如下: <appSettings> <
- Vector简介ArrayList 和 Vector 其实大同小异,基本结构都差不多,但是一些细节上有区别:比如线程安全与否,扩容的大小等,
- 本文实例讲述了C语言二叉树常见操作。分享给大家供大家参考,具体如下:一、基本概念每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。性质
- 手机号登录在现在的项目中用的场景非常多,实现起来也不难,今天我们就一起来通过演示实现登录过程。 一、首先需要注册个第三方的账户,比
- 题目要求阅读理解读完题的我be like:去看了遍英文版就懂了,题目中的种类【type】不是种类数…&hell
- 字符串的操作是C#程序设计中十分重要的一个组成部分,本文就以实例形式展现了C#实现移除字符串末尾指定字符的方法。相信对大家学习C#程序设计有
- 域对象共享数据使用ServletAPI向request域对象共享数据@RequestMapping("/testServletAP
- Android 实现单线程轮循机制批量下载图片listview 在为item 添加从网上下载下来的图片时, 如果每次都整合一个item时都需
- 这篇文章主要介绍了springboot集成fastDfs过程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习