WPF 实现圣诞树

WPF开发者QQ群: 340500857  | 微信群 -> 进入公众号主页 加入组织

      由于微信群人数太多入群请添加小编微信号

(yanjinhuawechat)或(W_Feng_aiQ)入群

(需备注WPF开发者

  PS:有更好的方式欢迎推荐。

01

代码如下

一、创建 SnowCanvas.cs 继承 Control代码如下。

c23154d25813d1ca4176d5551f7c69a7.png

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Threading;namespace WPFDevelopers.Controls
{[TemplatePart(Name = CanvasTemplateName, Type = typeof(Canvas))]public class SnowCanvas: Control{private const string CanvasTemplateName = "PART_Canvas";private Canvas _canvas;private readonly Random _random = new Random((int)DateTime.Now.Ticks);public ImageSource Icon{get { return (ImageSource)GetValue(IconProperty); }set { SetValue(IconProperty, value); }}public static readonly DependencyProperty IconProperty =DependencyProperty.Register("Icon", typeof(ImageSource), typeof(SnowCanvas), new PropertyMetadata(null));static SnowCanvas(){DefaultStyleKeyProperty.OverrideMetadata(typeof(SnowCanvas), new FrameworkPropertyMetadata(typeof(SnowCanvas)));}public override void OnApplyTemplate(){base.OnApplyTemplate();_canvas = GetTemplateChild(CanvasTemplateName) as Canvas;if (_canvas == null) return;this.Loaded += (s, e) => {var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(300) };timer.Tick += (s1, arg) => AddSnowflake();timer.Start();};}protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e){base.OnMouseLeftButtonDown(e);}private void AddSnowflake(){var x = _random.Next(0, (int)_canvas.ActualWidth);var y = -10;var size = _random.Next(4, 12);var translateTransform = new TranslateTransform(x, y);var snowflake = new Snowflake{RenderTransform = new TransformGroup{Children = new TransformCollection {  translateTransform }},HorizontalAlignment = HorizontalAlignment.Left,VerticalAlignment = VerticalAlignment.Top,Width = size,Height = size};_canvas.Children.Add(snowflake);y += (int)(_canvas.ActualHeight + 10);DoubleAnimation animation = new DoubleAnimation{To = y,Duration = TimeSpan.FromSeconds(_random.Next(3, 8))};Storyboard.SetTarget(animation, snowflake);Storyboard.SetTargetProperty(animation, new PropertyPath("RenderTransform.Children[0].Y"));Storyboard story = new Storyboard();story.Completed += (sender, e) => _canvas.Children.Remove(snowflake);story.Children.Add(animation);snowflake.Loaded += (sender, args) => story.Begin();}}
}

二、Snowflake.xaml 代码如下

74efa5511625f7d23467dd80f7616b81.png

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;namespace WPFDevelopers.Controls
{public class Snowflake: Control{static Snowflake(){DefaultStyleKeyProperty.OverrideMetadata(typeof(Snowflake), new FrameworkPropertyMetadata(typeof(Snowflake)));}public Snowflake(){CacheMode = new BitmapCache();}public override void OnApplyTemplate(){base.OnApplyTemplate();}}
}

三、SnowCanvas.xaml代码如下

049963abbee67f1f520cf323339188b7.png

<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:SnowCanvas}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Width" Value="672"/><Setter Property="Height" Value="376"/><Setter Property="Background" Value="#FFAD2B28"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:SnowCanvas}"><Grid  Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"Background="{TemplateBinding Background}"><Canvas x:Name="PART_Canvas" Height="246" Width="246"Background="#FF0C1935"><Canvas.Clip><EllipseGeometry Center="123,123" RadiusX="120" RadiusY="120"/></Canvas.Clip><Image Source="{TemplateBinding Icon}"Canvas.Left="25" Canvas.Top="30"/></Canvas></Grid></ControlTemplate></Setter.Value></Setter>
</Style>
<Style TargetType="{x:Type controls:Snowflake}" BasedOn="{StaticResource ControlBasicStyle}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:Snowflake}"><Ellipse Fill="{StaticResource WhiteSolidColorBrush}"Width="{TemplateBinding Width}"Height="{TemplateBinding Height}"/></ControlTemplate></Setter.Value></Setter>
</Style>
</ResourceDictionary>

四、SnowCanvasExample.xaml代码如下

475cb62be575720547f4cfe1d56706cd.png

<UserControl x:Class="WPFDevelopers.Samples.ExampleViews.SnowCanvasExample"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><wpfdev:SnowCanvas  Icon="pack://application:,,,/Images/Snow/SnowTree.png"/></Grid>
</UserControl>

02


效果预览

鸣谢素材提供者 - Alyssa Nicoll

源码地址如下

github:https://github.com/yanjinhuagood/WPFDevelopers.git

gitee:https://gitee.com/yanjinhua/WPFDevelopers.git

WPF开发者QQ群: 340500857 

blogs: https://www.cnblogs.com/yanjinhua

Github:https://github.com/yanjinhuagood

出处:https://www.cnblogs.com/yanjinhua

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请著名作者 出处 https://github.com/yanjinhuagood

12836900774f522101d80eff96296096.png

扫一扫关注我们,

070a32eb60f706b140b9282a7695861e.gif

更多知识早知道!

83f75b1535b4239181f39a596f9def5b.gif

点击阅读原文可跳转至源代码

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

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

相关文章

sdut2784cf 126b Good Luck!(next数组)

链接 next数组的巧妙应用 学弟出给学弟的学弟的题。。 求最长的 是前缀也是后缀同时也是中缀的串 next的数组求的就是最长的前后缀 但是却不能求得中缀 所以这里 就把尾部去掉之后再求 这样就可以保证是中缀了 先把所有既是前缀也是后缀的长度的求出来标记 然后再去掉尾部 求…

聊一聊基于Nacos的metadata完成服务间的AB测试

背景 在很多时候&#xff0c;产品同学或其他 boss 会有一些想法&#xff0c;或好或坏&#xff0c;都会想放到线上环境去验证&#xff0c;看看能不能带来更好的效果。这其实就是一个提出假设和验证假设的过程&#xff0c;而 AB 测试&#xff0c;是验证假设的好方法。对于服务之间…

豆瓣评分9分+,每一部看完不禁感慨!这里是神州大地!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片的一大重要意义&#xff0c;就在于它能将我们的视野和脚步&#xff0c;引向我们无法企及的地方和领域&#xff0c;又能让那些我们曾经到过的地方、经历过的人事&#xff0c;变得更有深意。今天&#xff0c;就给大家分享7部顶级纪录…

旅游社交网站 游范儿

为什么80%的码农都做不了架构师&#xff1f;>>> 应用名称&#xff1a;旅游社交网站 游范儿 应用URL地址&#xff1a;http://tumi.cloudfoundry.com/ 应用说明及使用场景&#xff1a; 用于爱好旅游的人士&#xff0c;发游记&#xff0c;以及所见所闻&#xff0c;…

nginx源码学习Unix - Unix域协议

说到什么是域协议就会出现这么个解释&#xff1a; UNIX域协议并不是一个实际的协议族&#xff0c;而是在单个主机上执行客户/服务器通信的一种方法&#xff0c;所用API与在不同主机上执行客户/服务器通信所使用的API相同。UNIX域协议可以视为IPC方法之一。 我们白话解释下Unix域…

oracle12c考试内容,12c ocp考试内容

oca1z0-047(Oracle Database SQL Expert 1Z0-047) 60个题&#xff0c;90分钟&#xff0c;66%过关。/1z0-051(Oracle Database 11g: SQL Fundamentals I 1Z0-051) 64个题&#xff0c;120分钟&#xff0c;60%过关。/1z0-061(Oracle Database 12c: SQL Fundamentals 1Z0-061) 75个…

微软开源的Web测试和自动化神器 Playwright

Playwright 是微软开源的一个用于 Web 测试和自动化的框架, 提供了可靠的端到端测试, 功能非常强大, 可以在测试, 爬虫&#xff0c;自动化场景中使用。跨浏览器Playwright 支持所有现代的渲染引擎&#xff0c;包括 Chromium、WebKit 和 Firefox。跨平台在 Windows, Linux 和 ma…

史上最厉害的“1+2”!这个270年前出现的大难题,已经60多年没有出现好消息了..........

全世界只有3.14 % 的人关注了爆炸吧知识费马费马欧拉欧拉数学是科学的皇后数论是数学中的皇冠这顶皇冠每一次被举起它的光芒都在照亮数学的前方从112到“12”人类一次次逼近“哥德巴赫猜想”的真相从一张白纸到上面写满n>2的证明“费马大定理”凝聚成了一部数学史从2、3、5、…

放寒假的硕博研究生将经历什么?

全世界只有3.14 % 的人关注了爆炸吧知识1月中下旬基本全国的高校都放假了&#xff0c;除了部分因为疫情滞留在学校和外地的学生&#xff0c;绝大多数的学生都会回家过年。平时自带学霸光环&#xff0c;可以借口工作学业繁忙&#xff0c;不回家&#xff0c;不用应酬&#xff0c;…

自动化测试有感

1、 研究自动化测试也有一段时间了&#xff0c;从不熟悉到慢慢的了解&#xff0c;从不会到会&#xff0c;从迷茫到清晰...... 前段时间一直都很疑惑&#xff0c;为什么要自动化&#xff0c;自动化能给我们带来哪些好处&#xff1f;它存在的价值在哪里&#xff1f;运行一个脚本…

iOS 集合的深复制与浅复制

2019独角兽企业重金招聘Python工程师标准>>> 概念 对象拷贝有两种方式&#xff1a;浅复制和深复制。顾名思义&#xff0c;浅复制&#xff0c;并不拷贝对象本身&#xff0c;仅仅是拷贝指向对象的指针&#xff1b;深复制是直接拷贝整个对象内存到另一块内存中。 一图以…

Adb安装程序出现TimeOut错误

为什么80%的码农都做不了架构师&#xff1f;>>> 安装Apk过程中&#xff0c;出现如下错误&#xff1a; Failed to install on device ‘XXX′: timeout 原因时设备速度太卡&#xff0c;导致启动超时&#xff0c;解决办法&#xff1a;延长超时时间。 方法&#xff…

2021.NET大会日程首发!行程亮点全曝光!

{倒计时4天文末有福利→.NET机器人定制抱枕}2021年12月18日由中国各地技术社区共同发起举办、知名企业和开源组织联合协办的2021年中国.NET开发者大会即将盛大开幕▽2020/12/18-12/19主题&#xff1a;开源共建|开放创新|开发赋能形式&#xff1a;线上直播- 长按二维码免费领票 …

继Science发文后,Nature也发文评论曹雪涛“误用图片”调查结果

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;募格学术2021年1月26日傍晚 Nature 网站以头条新闻的方式刊出了题为“著名中国免疫学家没有剽窃和学术造假”的新闻并配以曹雪涛的照片&#xff0c;该新闻大篇幅报道了科技部等多部门对于中国工程院院士曹雪涛的联合…

linux运行.pak文件,使用game-to-flatpak脚本将商业Linux游戏安装程序转换为Flatpak应用程序...

现在有一个新的脚本&#xff0c;它允许你将各种商业Linux游戏的安装程序转换成可以在各种GNU/Linux发行版上运行的Flatpak软件包。这是一个开源的shell脚本&#xff0c;由GNOME开发人员Bastien Nocera开发&#xff0c;它做了一件事&#xff0c;即自动将各种格式的商业Linux游戏…

Log4j 2漏洞(CVE-2021-44228)的快速响应

简介2021 年 12 月 9 日&#xff0c;在Log4j的 GitHub 上公开披露了一个影响多个版本的 Apache Log4j 2 实用程序的高严重性漏洞 CVE-2021-44228、CVSSv3 10.0 (https://logging.apache.org/log4j/2.x) 。该漏洞由阿里云安全团队的陈兆军&#xff08;可能为音译&#xff09;发现…

Xcode4.5编译ffmpeg成功,过程说明

最近项目要用音视频的通话&#xff0c;需要用ffmpeg来实现&#xff0c;但是ffmpeg在iOS平台上的编译有些问题。 1 下载代码 1.下载ffmpeg源代码 git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg 参考&#xff1a;http://ffmpeg.org/download.html 2.下载ffmpeg-iphone…

box2d 绘制圆

在让刚体听我的——ApplyForce、ApplyImpulse、SetLinearVelocity一节中&#xff0c;来自天地会的sxl001问道如何创建圆形的边界(Round Boundary)&#xff0c;好吧&#xff0c;我用这个教程来回答他。 实际上Box2D中没有专门创建圆弧的API (b2CircleDef创建的是实体圆形不是圆弧…