C# WPF 基础等待动画Loading...动态转圈 Storyboard ContentControl

news2024/12/23 10:43:39

这个效果图...直接放上吧,实际是转圈效果,使用起来最方便的一种。

【这是个基础版,灵活度很高】

  • Xaml

绘制Loading图案,及触发的动画效果,实际控制的每个组件 Opacity - 透明度 属性。

<Style TargetType="{x:Type local:LoadingControl}">
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="Focusable" Value="False"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Foreground" Value="Red"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:LoadingControl}">
                    <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" VerticalAlignment="Center" > 
                            <Grid.Resources>
                                <DrawingBrush x:Key="brush" Stretch="None" AlignmentX="Center" AlignmentY="Top">
                                    <DrawingBrush.Drawing>
                                    <GeometryDrawing Brush="Red">
                                            <GeometryDrawing.Geometry>
                                            <EllipseGeometry RadiusX="{Binding RadiusX, RelativeSource={RelativeSource TemplatedParent}}" 
                                                             RadiusY="{Binding RadiusY, RelativeSource={RelativeSource TemplatedParent}}"/>
                                            </GeometryDrawing.Geometry>
                                        </GeometryDrawing>
                                    </DrawingBrush.Drawing>
                                </DrawingBrush>
                            </Grid.Resources>

                            <!--绘制图案-->
                            <Rectangle x:Name="r01" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="0"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r02" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="30"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r03" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="60"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r04" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="90"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r05" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="120"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r06" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="150"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r07" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="180"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r08" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="210"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r09" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="240"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r10" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="270"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r11" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="300"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>
                            <Rectangle x:Name="r12" Fill="{StaticResource brush}" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
                                <Rectangle.RenderTransform>
                                    <RotateTransform Angle="330"/>
                                </Rectangle.RenderTransform>
                            </Rectangle>

                            <Grid.Triggers>
                                <!--动画效果 可以放别的 事件 或 属性 触发-->
                                <EventTrigger RoutedEvent="Grid.Loaded">
                                    <BeginStoryboard>
                                        <Storyboard RepeatBehavior="Forever">
                                            <DoubleAnimation Storyboard.TargetName="r01" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.00000" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r02" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.08333" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r03" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.16666" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r04" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.24999" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r05" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.33332" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r06" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.41665" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r07" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.49998" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r08" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.58331" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r09" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.66664" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r10" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.74997" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r11" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.83330" To="1"/>
                                            <DoubleAnimation Storyboard.TargetName="r12" Storyboard.TargetProperty="Opacity" AutoReverse="True" Duration="0:0:0.39333" BeginTime="0:0:0.91663" To="1"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                            </Grid.Triggers>
                        </Grid> 
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

如果是想直接用 Storyboard 动态效果,那就:(示例只是随便找的Code,不是Loading了哈~)

// i:Interaction.Triggers  --  i:EventTrigger  --  i:InvokeCommandAction  -- 无关的插曲

//比如 DockPanel 的样式里,想在 Event 加入动态效果
<DockPanel.Triggers>
    <!--MouseEnter时 Storyboard效果-->
    <EventTrigger RoutedEvent="MouseEnter">
		<BeginStoryboard>
			<Storyboard>
				<ColorAnimation Storyboard.TargetProperty="(Control.BorderBrush).(SolidColorBrush.Color)" 
					Storyboard.TargetName="BranchAccountingBorder" Duration="0:0:0.1" 
					From="#E7E7E8" To="#E0301E" AutoReverse="False" />
			</Storyboard>
		</BeginStoryboard>
	</EventTrigger>
	<EventTrigger RoutedEvent="MouseLeave">
		<BeginStoryboard>
			<Storyboard>
				<ColorAnimation Storyboard.TargetProperty="(Control.BorderBrush).(SolidColorBrush.Color)" 
					Storyboard.TargetName="BranchAccountingBorder" Duration="0:0:0.1" 
					From="#E0301E" To="#E7E7E8" AutoReverse="False" />
			</Storyboard>
		</BeginStoryboard>
	</EventTrigger>
</DockPanel.Triggers>

<!--在没有 Command 属性的控件加入交互命令,使用i : 引用 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" -->
<i:Interaction.Triggers>
	<i:EventTrigger EventName="MouseLeftButtonDown">
		<i:InvokeCommandAction Command="{Binding CheckTestCommand}"></i:InvokeCommandAction>
	</i:EventTrigger>
</i:Interaction.Triggers>
  • LoadingControl.cs  可省略

提供使用处的 X Y 属性(外观效果),用的时候调整就看得出来啦

using System;
using System.Windows;
using System.Windows.Controls;

namespace MyTest.Control
{
    public class LoadingControl : ContentControl
    {
        /// <summary>
        /// Y轴半径
        /// </summary>
        public static readonly DependencyProperty RadiusYPropertyProperty;

        /// <summary>
        /// X轴半径
        /// </summary>
        public static readonly DependencyProperty RadiusXPropertyProperty;

        /// <summary>
        /// 静态构造方法
        /// </summary>
        static LoadingControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(LoadingControl), new FrameworkPropertyMetadata(typeof(LoadingControl)));
            RadiusYPropertyProperty = DependencyProperty.Register("RadiusY", typeof(string), typeof(LoadingControl), new PropertyMetadata("0"));
            RadiusXPropertyProperty = DependencyProperty.Register("RadiusX", typeof(string), typeof(LoadingControl), new PropertyMetadata("0"));
        }

        /// <summary>
        /// 构造方法
        /// </summary>
        public LoadingControl()
        {

        }

        /// <summary>
        /// X轴半径
        /// </summary>
        public string RadiusX
        {
            get { return (string)GetValue(RadiusXPropertyProperty); }
            set { SetValue(RadiusXPropertyProperty, value); }
        }

        /// <summary>
        /// Y轴半径
        /// </summary>
        public string RadiusY
        {
            get { return (string)GetValue(RadiusYPropertyProperty); }
            set { SetValue(RadiusYPropertyProperty, value); }
        }
    }
}
  • xaml 使用

其实就引用这个控件,然后调整属性就OK 了。

由于动画效果,示例里是加载的时候就一直转动,所以控制 Visibility 属性就可以了。

也可以自定义其他属性 或 事件,触发转动、停止效果。

<mycontrols:LoadingControl Visibility="Collapsed" RadiusX="1.2" RadiusY="3" Width="20" Height="20"/>

 

【这是个基础版,灵活度很高】   可以改样式、触发时机......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

元宇宙工程系,来了一位“吃螃蟹”者

转自《中国科学报》 记者 温才妃 潘志庚&#xff08;右&#xff09;给学生讲授元宇宙技术。受访者供图 元宇宙办学潮正在高校中暗涌。 不久前&#xff0c;南京信息工程大学人工智能学院&#xff08;未来技术学院&#xff09;信息工程系正式更名为元宇宙工程系&#xff0c;成为…

【密码加密原则二】

目录 1 密码加密原则&#xff08;续&#xff09; 1.1 使用加盐的方式可以使得“密码” 1.2 优缺点 1 密码加密原则&#xff08;续&#xff09; 1.1 使用加盐的方式可以使得“密码” 如果用户的密码过于简单&#xff0c;使用加盐的方式可以使得“密码”&#xff08;其实是…

数据结构-八大排序

八大排序一&#xff0c;直接插入排序二&#xff0c;希尔排序三&#xff0c;选择排序四&#xff0c;堆排序五&#xff0c;冒泡排序六&#xff0c;快速排序1&#xff0c;递归版本&#xff08;1&#xff09;hoare法&#xff08;2&#xff09;挖坑法&#xff08;3&#xff09;前后指…

5 年 Python ,总结的 10 条 Python 使用技巧

今天给大家分享 10 个我平时整理非常实用的 Python 开发小技巧&#xff0c;内容目录如下&#xff1a; 值得一提的是&#xff0c;这 10 个技巧全部收录在我自己写的 《Python黑魔法指南》里。 1. 如何在运行状态查看源代码&#xff1f; 查看函数的源代码&#xff0c;我们通常…

Apache Drill的学习

Drill的下载地址&#xff1a; Index of /dist/drill 上传安装包后&#xff0c;解压&#xff0c;测试环境中&#xff0c;我直接放到/root目录下了 tar -zxvf apache-drill-1.11.0.tar.gz 进入/root/apache-drill-1.11.0/bin 启动命令&#xff1a; ./sqlline -u jdbc:drill:…

VMware创建Linux虚拟机之(四)ZooKeeperHBase完全分布式安装

Hello&#xff0c;world&#xff01; &#x1f412;本篇博客使用到的工具有&#xff1a;VMware16 &#xff0c;Xftp7 若不熟悉操作命令&#xff0c;推荐使用带GUI页面的CentOS7虚拟机 我将使用带GUI页面的虚拟机演示 虚拟机&#xff08;Virtual Machine&#xff09; 指通过软…

C语言基础

文章目录二. 前言1.vscode 搭建C语言开发环境2.编程语言的演变2-1.计算机语言2-2 解释型vs编译型2-2 面向过程vs面向对象三. C语言基础0.数据存储范围1.变量与常量2.数据类型2-1 整型数据2-2 浮点型数据2-3 字符型数据2-4 格式化输出2-5 输入框语句2-5 字符输入函数2-6 字符输出…

硬件内存模型

Hardware Memory Models 这是Go语言作者之一的rsc语言内存模型相关博文之一&#xff1b;硬件内存模型的笔记。硬件内存模型对应的是汇编指令的执行&#xff0c;可以认为每一条指令原子执行。 Sequential Consistency 顺序一致性模型 多个进程的操作按照一定顺序执行&#xf…

(附源码)ssm小米购物网站 毕业设计 261624

基于ssm小米购物网站 摘 要 近年来&#xff0c;随着移动互联网的快速发展&#xff0c;电子商务越来越受到网民们的欢迎&#xff0c;电子商务对国家经济的发展也起着越来越重要的作用。简单的流程、便捷可靠的支付方式、快捷畅通的物流快递、安全的信息保护都使得电子商务越来越…

[附源码]计算机毕业设计宁财二手物品交易网站Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

数据结构(13)最小生成树JAVA版:prim算法、kruskal算法

目录 13.1.概述 13.2.prim算法 13.2.1.概述 13.2.2.代码实现 13.3.kruskal算法 13.3.1.概述 13.3.2.代码实现 13.1.概述 最小生成树&#xff0c;包含图的所有顶点的一棵树&#xff0c;树的边采用包含在图中的原有边中权重和最小的边。翻译成人话就是遍历一遍全图所有顶点…

Java基于J2EE的流浪动物收容与领养管理系统

随着城市饲养宠物日益增加&#xff0c;流浪动物也越来越多&#xff0c;本文对流浪动物出现的原因&#xff0c;引发的社会问题以及流浪动物的保护等方面进行思考阐述,以期唤醒人们对动物福利的关注和对生命的珍爱。 通过以上的调研研究发现&#xff0c;如此多的流浪动物是如此的…

肠道菌群代谢组学之粪便微生物移植治疗原发性硬化性胆管炎

​ The American Journal of GASTROENTEROLOGY (IF10.241) 10位原发性硬化性胆管炎患者的粪便微生物移植&#xff1a;一个试点的临床试验 研究背景 百趣代谢组学分享&#xff0c;原发性硬化性胆管炎&#xff08;Primary sclerosing cholangitis&#xff0c;PSC&#xff09;是…

【Java语言】— 快速入门

Java背景知识 Java是美国sun公司在1995年推出的一门计算机高级编程语言。 Java早期称为Oak&#xff08;橡树&#xff09;&#xff0c;后改为Java。 Java之父:詹姆斯高斯林。 2009年sun公司被Oracle公司收购。 为什么用Java 世界上最流行的编程语言之一&#xff0c;在国内使用…

生成式AI结合3D、XR怎么玩?NVIDIA、Niantic等公司已入局

最近生成式AI风头有点大&#xff0c;这种技术只需要用文字就能作画&#xff0c;而且效果惊艳&#xff0c;堪比专业画师的作品。其中一些热门的方案包括DALL-E 2、Midjourney、BariumAI、D-ID AI、Stable Diffusion等等&#xff0c;这些工具简单、好玩&#xff0c;已经被无数网友…

BYD精制项目除铜工艺去除铜离子

某精细化工公司BYD精制项目 工艺选择 过滤系统螯合树脂除铜系统合格品回收箱 工艺原理 在不应该1,4丁炔二醇的情况下去除铜离子 项目背景 1,4-丁炔二醇BYD&#xff08;but-2-yne-1,4-diol&#xff09;是一种重要的中间体化工原料&#xff0c;广泛应用于生产丁二醇及其下游产…

2022CTF培训(五)字符串混淆进阶代码自解密

附件下载链接 复杂的字符串混淆 原理 之前的字符串混淆是一次性解密的&#xff0c;找到解密函数即可获得所有字符串&#xff0c;同时执行解密函数后内存中也可直接获得所有字符串。 因此对抗人员升级了混淆技术&#xff0c;使得解密仅在使用时发生&#xff0c;从而避免了全部…

微机原理不挂科

微机原理1.计算机基础1.1数制码值转换1.2码制1.3微机组成2.8088/8086微处理器2.1CPU内部结构2.2寄存器2.3存储器分段和地址空间2.4堆栈2.5 8086/8088CPU引脚2.6 时序与总线操作3.指令系统3.2寻址方式3.3语法规则3.4数据传送指令3.5算术运算指令3.6逻辑运算与移位指令3.7串操作指…

(二十) 共享模型之工具【JUC】【线程安全集合类】

一、线程安全集合类概述 线程安全集合类可以分为三大类&#xff1a;&#xff08;1&#xff09;遗留的线程安全集合如 Hashtable &#xff0c; Vector&#xff08;2&#xff09;使用 Collections 装饰的线程安全集合&#xff0c;如&#xff1a; 1️⃣Collections.synchronizedCo…

[附源码]计算机毕业设计JAVA游戏账号交易平台

[附源码]计算机毕业设计JAVA游戏账号交易平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…