好玩的WPF第三弹:颤抖吧,地球!消失吧,地球!

2023-11-08 23:30

本文主要是介绍好玩的WPF第三弹:颤抖吧,地球!消失吧,地球!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我承认这一篇比较标题党,不过下面这个GIF貌似也和适合这个标题嘛。

这里写图片描述

(画质比较烂是因为CSDN的博客图片限制在2M,所以我设置的是20帧,时间也很短,大家可以自己把项目拷回去慢慢看)

这个最终设计出来的样式:

这里写图片描述

中间的小圆点是一个Button,外面是一个经过切割的Grid,Grid里面还有一个Image。

其中在加上Image(地球图片)之前,Button还是很大的,所以给他设计了渐变色。

<Button Padding="20" Foreground="White" BorderBrush="#FFD8A00A" FontSize="16" Click="OnClick" Margin="100" Width="20" Height="20" RenderTransformOrigin="0.54,-0.058"><Button.Background><LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"><GradientStop Color="Black" Offset="0"/><GradientStop Color="#FF45ADB7" Offset="1"/></LinearGradientBrush></Button.Background><Button.Template><ControlTemplate TargetType="{x:Type Button}"><Grid><Ellipse x:Name="bg" Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="2" /><Ellipse x:Name="fr" Opacity="0" ><Ellipse.Fill><LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"><GradientStop Color="#CCFFFFFF" Offset="0"/><GradientStop Offset="1"/><GradientStop Color="#7FFFFFFF" Offset="0.392"/></LinearGradientBrush></Ellipse.Fill></Ellipse><ContentPresenter x:Name="ContentPresenter" Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/></Grid><ControlTemplate.Triggers><Trigger Property="IsMouseOver" Value="True" ><Setter TargetName="fr" Property="Opacity" Value="1"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Button.Template>
</Button>
<Image Source="Earth.jpg" />

上面这两个控件都放到Grid内部。

<Grid x:Name="layoutroot"><Grid.Resources><Storyboard x:Key="std"><DoubleAnimation From="1" To="0" Duration="0:0:6"Storyboard.TargetName="layoutroot"Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[1].Offset"/><DoubleAnimation Duration="0:0:4.5" BeginTime="0:0:1.5" From="1" To="0"Storyboard.TargetName="layoutroot"Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[2].Offset"/><ColorAnimation Duration="0" To="#00000000" Storyboard.TargetName="layoutroot"Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[2].Color"/></Storyboard></Grid.Resources>   <Grid.OpacityMask><LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"><GradientStop Color="#FF000000" Offset="0"/><GradientStop Color="#FF000000" Offset="1"/><GradientStop Color="#FF000000" Offset="1"/></LinearGradientBrush></Grid.OpacityMask><Grid.Clip><EllipseGeometry Center="150 150" RadiusX="150" RadiusY="150"/></Grid.Clip><Grid.Background><LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"><GradientStop Color="#FFFCFCFC" Offset="0.003"/><GradientStop Color="#FF76253C" Offset="1"/><GradientStop Color="#FF29769D" Offset="0.318"/><GradientStop Color="#FFA94444" Offset="0.84"/><GradientStop Color="#FFB2B62F" Offset="0.488"/><GradientStop Color="#FF9B2BD3" Offset="0.666"/><GradientStop Color="#FF5CC569" Offset="0.151"/></LinearGradientBrush></Grid.Background>
</Grid>

上面这些都是给Grid设置的渐变色,有了Image也没太大用了。

真正有用的是Resources。

后台文件中的抖动效果如下(在上一篇详细介绍了抖动过程):

// 全局变量
private double left = 0;
private double top = 0;
private Storyboard storyboard = new Storyboard();// 初始化
left = mainWindow.Left;
top = mainWindow.Top;private void DoubleAnimation()
{// 窗口抖动效果DoubleAnimation doubleAnimationL1 = new DoubleAnimation();doubleAnimationL1.BeginTime = TimeSpan.FromSeconds(0.01);doubleAnimationL1.Duration = TimeSpan.FromSeconds(0.01);doubleAnimationL1.From = mainWindow.Left;doubleAnimationL1.To = mainWindow.Left - 6;doubleAnimationL1.EasingFunction = new BounceEase() { Bounces = 12, EasingMode = EasingMode.EaseInOut };Storyboard.SetTarget(doubleAnimationL1, mainWindow);Storyboard.SetTargetProperty(doubleAnimationL1, new PropertyPath("(Left)"));DoubleAnimation doubleAnimationL2 = new DoubleAnimation();doubleAnimationL2.BeginTime = TimeSpan.FromSeconds(0.001);doubleAnimationL2.Duration = TimeSpan.FromSeconds(0.01);doubleAnimationL2.From = mainWindow.Left;doubleAnimationL2.To = mainWindow.Left + 6;doubleAnimationL2.EasingFunction = new BounceEase() { Bounces = 12, EasingMode = EasingMode.EaseInOut };Storyboard.SetTarget(doubleAnimationL2, mainWindow);Storyboard.SetTargetProperty(doubleAnimationL2, new PropertyPath("(Left)"));DoubleAnimation doubleAnimationT1 = new DoubleAnimation();doubleAnimationT1.BeginTime = TimeSpan.FromSeconds(0.01);doubleAnimationT1.Duration = TimeSpan.FromSeconds(0.01);doubleAnimationT1.From = mainWindow.Top;doubleAnimationT1.To = mainWindow.Top + 6; ;doubleAnimationT1.EasingFunction = new BounceEase() { Bounces = 12, EasingMode = EasingMode.EaseInOut };Storyboard.SetTarget(doubleAnimationT1, mainWindow);Storyboard.SetTargetProperty(doubleAnimationT1, new PropertyPath("(Top)"));DoubleAnimation doubleAnimationT2 = new DoubleAnimation();doubleAnimationT2.BeginTime = TimeSpan.FromSeconds(0.01);doubleAnimationT2.Duration = TimeSpan.FromSeconds(0.01);doubleAnimationT2.From = mainWindow.Top;doubleAnimationT2.To = mainWindow.Top - 6;doubleAnimationT2.EasingFunction = new BounceEase() { Bounces = 12, EasingMode = EasingMode.EaseInOut };Storyboard.SetTarget(doubleAnimationT2, mainWindow);Storyboard.SetTargetProperty(doubleAnimationT2, new PropertyPath("(Top)"));storyboard.Children.Add(doubleAnimationL1);storyboard.Children.Add(doubleAnimationL2);storyboard.Children.Add(doubleAnimationT1);storyboard.Children.Add(doubleAnimationT2);storyboard.RepeatBehavior = RepeatBehavior.Forever;storyboard.Completed += new EventHandler(storyboard_Completed);storyboard.Begin(this, true);
}private void storyboard_Completed(object sender, EventArgs e)
{// 解除绑定 storyboard.Remove(this);// 解除TextWindow窗口 storyboard.Children.Clear();//grid.Children.Clear();// 恢复窗口初始位置mainWindow.Left = left;mainWindow.Top = top;
}

后台文件中的消失效果如下:

// 全局变量
Storyboard storyboard2 = null;// 初始化
storyboard2 = (System.Windows.Media.Animation.Storyboard)layoutroot.Resources["std"];
storyboard2.Completed += (t, r) => this.Close();this.layoutroot.Loaded += (aa, bb) =>
{EllipseGeometry ellipsegeometry = (EllipseGeometry)this.layoutroot.Clip;double dx = layoutroot.ActualWidth / 2d;double dy = layoutroot.ActualHeight / 2d;ellipsegeometry.Center = new Point(dx, dy);ellipsegeometry.RadiusX = dx;ellipsegeometry.RadiusY = dy;
};

然后是Button的OnClick事件:

private void OnClick(object sender, RoutedEventArgs e)
{if (storyboard2 != null){storyboard2.Begin();}         DoubleAnimation();
}

源码的话,上面也都有了。GIF我就不再上传咯,毕竟2M的限制太无趣了。



感谢您的访问,希望对您有所帮助。 欢迎大家关注、收藏以及评论。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


这篇关于好玩的WPF第三弹:颤抖吧,地球!消失吧,地球!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

WPF入门到跪下 第十三章 3D绘图 - 3D绘图基础

3D绘图基础 四大要点 WPF中的3D绘图涉及4个要点: 视口,用来驻留3D内容3D对象照亮部分或整个3D场景的光源摄像机,提供在3D场景中进行观察的视点 一、视口 要展示3D内容,首先需要一个容器来装载3D内容。在WPF中,这个容器就是Viewport3D(3D视口),它继承自FrameworkElement,因此可以像其他元素那样在XAML中使用。 Viewport3D与其他元素相

看病要排队这个是地球人都知道的常识

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝唯有付出,才有丰富的果实收获! 看病要排队这个是地球人都知道的常识。 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的。0068所去的医院有三个医生(汗,这么少)同时看病。而看病的人病情有轻重,所以不能根据简单的先来

【无线通信发展史⑧】测量地球质量?重力加速度g的测量?如何推导单摆周期公式?地球半径R是怎么测量出来的?

前言:用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注,你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢? 首先肯定是因为我本身就是一名从业通信者,想着更加了解自己专业的知识,所以更想着从头开始了解通信的来源以及在每一个时代的发展进程。 为什么会从头开始写通信? 我最早是学习了中华上下五千年,应该说朝代史,这个算个人兴趣,从夏

C# WPF燃气报警器记录读取串口工具

C# WPF燃气报警器记录读取串口工具 概要串口帧数据布局文件代码文件运行效果源码下载 概要 符合国标文件《GB+15322.2-2019.pdf》串口通信协议定义;可读取燃气报警器家用版设备历史记录信息等信息; 串口帧数据 串口通信如何确定一帧数据接收完成是个麻烦事,本文采用最后一次数据接收完成后再过多少毫秒认为一帧数据接收完成,开始解析出来。每次接收到数据更新一次re

仿论坛项目--第三部分习题

1.关于前缀树的特征描述不正确的是: 根节点不包含字符,除根节点以外的每个节点,只包含一个字符。 从根节点到某一个节点,路径经过的字符连接起来,为该节点对应的字符串。 每个节点的所有子节点,包含的字符串不相同。 每个节点,最多只能包含2个节点。 解析: 这些描述都是关于前缀树(Trie)的一些基本特点。前缀树是一种树形结构,用于高效地存储字符串数据,常用于自动补全或拼写检查等应用。在前缀树中:

C#下设置TextBox默认显示文字,点击后消失

TextBox的ID为account和password //用户输入account.Attributes.Add("Value", "请输入用户名");account.Attributes.Add("OnFocus", "if(this.value=='请输入用户名') {this.value=''}");account.Attributes.Add("OnBlur", "if

遥感技术在环境监测中的应用:揭秘地球变化的天眼

当我们仰望星空,探索宇宙的奥秘时,别忘了脚下的这片土地同样蕴藏着无数未解之谜。遥感技术,这个听起来似乎遥不可及的名字,其实正是我们透视地球环境变化的“天眼”。今天将带大家一探遥感技术如何在环境监测中大显身手,帮助我们更精准地监测和评估这个星球的每一次呼吸与脉动。 什么是遥感技术? 遥感,顾名思义,是从远处感知。它利用安装在卫星、飞机或其他平台上的传感器,捕捉地球表面的电磁辐射信息,包括可见光、

WPF-快速构建统计表、图表并认识相关框架

一、使用ScottPlot.Wpf 官网地址:https://scottplot.net/quickstart/wpf/ 1、添加NuGet包:ScottPlot.Wpf 2、XAML映射命名空间:  xmlns:ScottPlot="clr-namespace:ScottPlot.WPF;assembly=ScottPlot.WPF" 3、简单示例: <ScottPlot:WpfP