创建一个简易的风扇动画界面:基于 WPF 和 XAML 的实现教程

在本教程中,我们将通过使用 WPF (Windows Presentation Foundation)XAML (Extensible Application Markup Language) 创建一个简单的“台式风扇”界面。我们将使用 XAML 绘制风扇的外观,包含风扇叶片、风扇框架、支架和按钮等元素,并通过一些基本的动画效果让它动起来。

这个示例将包含以下内容:

  1. 创建风扇的静态图形界面

  2. 绘制风扇的旋转叶片

  3. 使用按钮控制风扇的速度(动画效果)


1. 创建项目和窗口

首先,在 Visual Studio 中创建一个新的 WPF 应用程序 项目。创建完成后,我们会在 MainWindow.xaml 文件中编写我们的 XAML 代码。

我们定义一个窗口 Window,并指定其样式和大小。

<Window x:Class="DesktopFan.MainWindow"xmlns="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:DesktopFan"mc:Ignorable="d"WindowStyle="None"Title="台式小风扇" Height="600" Width="600" WindowStartupLocation="CenterScreen">

这段代码指定了窗口的基础信息,如窗口大小(Height="600"Width="600")和标题(Title="台式小风扇")。并且去掉了默认的窗口样式(WindowStyle="None"),使其看起来像一个简洁的风扇界面。


2. 定义风扇图形的渐变效果

为了让风扇看起来更现代化,我们为背景、叶片、中心以及底座等部分添加渐变效果。通过使用 WPF 中的 LinearGradientBrushRadialGradientBrush,我们可以创建平滑的色彩过渡。

Window.Resources 部分,我们定义了风扇的各种渐变效果:

<Window.Resources><!-- 背景渐变 --><LinearGradientBrush x:Key="BackgroundGradient" StartPoint="0,0" EndPoint="1,1"><GradientStop Color="#E0E7FF" Offset="0"/><GradientStop Color="#F0FDFA" Offset="1"/></LinearGradientBrush><!-- 风扇叶片渐变 --><LinearGradientBrush x:Key="BladeGradient" StartPoint="0,0" EndPoint="1,1"><GradientStop Color="#B3FFFFFF" Offset="0"/><GradientStop Color="#B3A5B4FC" Offset="0.6"/><GradientStop Color="#E66366F1" Offset="1"/></LinearGradientBrush><!-- 风扇中心渐变 --><RadialGradientBrush x:Key="CenterGradient" GradientOrigin="0.5,0.5" Center="0.5,0.5" RadiusX="0.8" RadiusY="0.8"><GradientStop Color="White" Offset="0"/><GradientStop Color="#818CF8" Offset="0.6"/><GradientStop Color="#6366F1" Offset="1"/></RadialGradientBrush><!-- 风扇底座渐变 --><RadialGradientBrush x:Key="BaseGradient" GradientOrigin="0.6,0.3" Center="0.6,0.3" RadiusX="0.8" RadiusY="0.8"><GradientStop Color="#B3B4BCF7" Offset="0"/><GradientStop Color="#6366F1" Offset="1"/></RadialGradientBrush>
</Window.Resources>

每个 Brush 定义了一个渐变色,使用不同的颜色和透明度值来模拟真实世界中风扇各部分的材质。


3. 创建风扇的外框和底座

接下来,我们需要绘制风扇的外框和底座。在 XAML 中,我们使用 EllipseRectangle 来绘制这些形状,并使用 Canvas 来安排它们的位置。

<Border Background="White" CornerRadius="24" Width="300" Height="450" VerticalAlignment="Center" HorizontalAlignment="Center"><StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"><Viewbox Width="220" Height="320" Margin="0,10,0,32"><Canvas Width="260" Height="300"><!-- 底座 --><Ellipse Canvas.Left="50" Canvas.Top="282" Width="160" Height="36" Fill="{StaticResource BaseGradient}"/><!-- 支架 --><Rectangle Canvas.Left="122" Canvas.Top="170" Width="16" Height="134" RadiusX="7" RadiusY="7" Fill="#A5B4FC"/><Rectangle Canvas.Left="120" Canvas.Top="160" Width="20" Height="30" RadiusX="10" RadiusY="10" Fill="#A5B4FC"/><!-- 风扇框架 --><Ellipse Canvas.Left="30" Canvas.Top="30" Width="200" Height="200" Fill="#F1F5F9" Stroke="#6366F1" StrokeThickness="5"/></Canvas></Viewbox></StackPanel>
</Border>

我们使用 Canvas 来精确控制各个元素的位置。这里的 Ellipse 用于绘制风扇的框架和底座,Rectangle 用于绘制支架。


4. 绘制风扇的叶片

风扇叶片是界面中的重要元素,我们需要通过 Path 来绘制叶片的形状。每个叶片的形状是一个四边形,使用 M100,100 L100,0 Q190,70 100,100 Z 路径描述(即一个从中心扩展到边缘的弯曲形状)。

我们在 Canvas 中绘制多个叶片,并给每个叶片应用一个旋转动画,让它们看起来像正在旋转的风扇。

<Canvas x:Name="FanBlades" Canvas.Left="30" Canvas.Top="30" Width="200" Height="200" RenderTransformOrigin="0.5,0.5"><Canvas.RenderTransform><RotateTransform Angle="0"/></Canvas.RenderTransform><!-- 叶片 1 --><Path Data="M100,100 L100,0 Q190,70 100,100 Z" Fill="{StaticResource BladeGradient}" Effect="{StaticResource BladeShadowEffect}"/><!-- 叶片 2 --><Path Data="M100,100 L100,0 Q190,70 100,100 Z" Fill="{StaticResource BladeGradient}" Effect="{StaticResource BladeShadowEffect}"/><!-- 叶片 3 --><Path Data="M100,100 L100,0 Q190,70 100,100 Z" Fill="{StaticResource BladeGradient}" Effect="{StaticResource BladeShadowEffect}"/>
</Canvas>

通过使用 RotateTransform,我们可以对 FanBlades 容器中的所有叶片进行旋转,模拟风扇叶片的转动。


5. 添加控制按钮

为了让用户能够控制风扇的开关和风速,我们添加了一些按钮。这些按钮可以让用户选择关闭风扇或设置风速。每个按钮都被设计成圆形,使用 EllipseButton 控件,并附加了事件处理函数。

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,12,0,0"><Button x:Name="OffButton" Content="关" Style="{StaticResource ActiveSpeedButton}" Tag="0" Click="SpeedButton_Click"/><Button x:Name="Speed1Button" Content="1档" Margin="16,0,0,0" Style="{StaticResource SpeedButton}" Tag="1" Click="SpeedButton_Click"/><Button x:Name="Speed2Button" Content="2档" Margin="16,0,0,0" Style="{StaticResource SpeedButton}" Tag="2" Click="SpeedButton_Click"/><Button x:Name="Speed3Button" Content="3档" Margin="16,0,0,0" Style="{StaticResource SpeedButton}" Tag="3" Click="SpeedButton_Click"/>
</StackPanel>

6. 运行与调试

在完成上述代码后,点击 运行 按钮,你将看到一个现代化的风扇界面。在界面上,点击控制按钮时,风扇叶片将旋转,并根据按钮选择的风速进行调整。


总结

通过 WPF 和 XAML,我们成功地创建了一个风扇动画界面。这个示例结合了图形绘制(使用 Path 和 Ellipse)和动画效果(通过 RotateTransform 和按钮事件),展示了如何使用 XAML 来开发具有交互性的图形界面。

你可以根据需要进一步扩展这个界面,增加更多动画效果或功能,例如风速动画,或甚至使用 Storyboard 来平滑控制风扇叶片的旋转。希望这个教程对你有所帮助!

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

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

相关文章

VPet虚拟桌宠,一款桌宠软件,支持各种互动投喂等. 开源免费并且支持创意工坊

&#x1f4cc; 大家好&#xff0c;我是智界工具库&#xff0c;每天分享好用实用且智能的开源项目&#xff0c;以及在JAVA语言开发中遇到的问题&#xff0c;如果本篇文章对您有所帮助&#xff0c;请帮我点个小赞小收藏小关注吧&#xff0c;谢谢喲&#xff01;&#x1f618; 工具…

HTTP Digest 认证:原理剖析与服务端实现详解

HTTP Digest 认证&#xff1a;原理剖析与服务端实现详解 HTTP 协议中的 Digest 认证&#xff08;摘要认证&#xff09;是一种比 Basic 认证更安全的身份验证机制&#xff0c;其核心设计是避免密码明文传输&#xff0c;并通过动态随机数&#xff08;Nonce&#xff09;防范重放攻…

PDF 表单按钮动态边框效果

问题描述 用户在 Acrobat X 中创建 PDF 表单时遇到一个需求&#xff1a;表单以网格形式列出多个选项&#xff0c;当点击某个选项时&#xff0c;需要在选项周围显示边框&#xff08;圆形或方形&#xff09;&#xff0c;再次点击时边框消失。 试过的解决方案 在文本上方放置透…

部署Gitlab-CE with Docker私有云环境

应用环境 Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-139-generic x86_64) Docker version 28.1.1, build 4eba377 文章目录 拉取容器镜像生成Run脚本参数解读实例脚本环境配置管理员密码遗忘服务邮箱配置邮件测试 运维问题集锦(1) 端口映射关系(2) 服务日志(3) 分支受保护 项目操作…

MyBatis 的动态 SQL 特性来实现有值字段才进行插入或更新

MyBatis 动态 SQL 解决方案 <!-- 动态INSERT语句 --> <insert id"addDailyFreezeTer" parameterType"com.linyang.pecker.pojo.DailyFreezeTerminalBean">INSERT INTO dailyfreezeter_info<trim prefix"(" suffix")" …

网络原理与 TCP/IP 协议详解

一、网络通信的本质与基础概念 1.1 什么是网络通信&#xff1f; 网络通信的本质是跨设备的数据交换&#xff0c;其核心目标是让不同物理位置的设备能够共享信息。这种交换需要解决三个核心问题&#xff1a; 如何定位设备&#xff1f; → IP地址如何找到具体服务&#xff1f;…

CUDA编程笔记(1)--最简单的核函数

本文用来记录cuda编程的一些笔记以及知识 本笔记运行在windows系统&#xff0c;vs编译器中&#xff0c;cuda版本是12.6 先看一下最基本的代码例子&#xff1a; #include<iostream> #include<cstdio> #include "cuda_runtime.h" #include "device…

系统架构中的限流实践:构建多层防护体系(二)

系统架构中的限流实践:构建多层防护体系 一、接入层限流:流量拦截第一关二、应用层限流(服务内限流)Java生态方案对比三、分布式限流(跨服务限流)四、数据层限流(数据库/缓存限流)1. 数据库防护策略2. 缓存优化方案五、中间件层限流(消息队列/分布式服务)六、客户端限…

AI学习笔记二十八:使用ESP32 CAM和YOLOV5实现目标检测

若该文为原创文章&#xff0c;转载请注明原文出处。 最近在研究使用APP如何显示ESP32 CAM的摄像头数据&#xff0c;看到有人实现把ESP32 CAM的数据流上传&#xff0c;通过YOLOV5来检测&#xff0c;实现拉流推理&#xff0c;这里复现一下。 一、环境 arduino配置esp32-cam开发环…

uni-app(5):Vue3语法基础上

Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统&#xff0c;只关注视图层&#xff0c;…

JAVA:Kafka 存储接口详解与实践样例

📦 1、简述 Kafka 以其高吞吐、可扩展和高可靠性著称,其强大性能的背后核心在于其高效的存储设计。Kafka 不是传统意义上的队列,而是一个分布式日志系统,其存储模块是核心组成部分。 本文将深入剖析 Kafka 的存储接口实现机制,并结合 Java 示例进行模拟验证。 🧱 2、…

Docker 使用镜像[SpringBoot之Docker实战系列] - 第537篇

历史文章&#xff08;文章累计530&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

数据库入门教程:以商品订单系统为例

数据库入门教程&#xff1a;以商品订单系统为例 一、前言 数据库是现代软件开发中不可或缺的基础&#xff0c;掌握数据库的基本概念和操作&#xff0c;是每个开发者的必经之路。本文将以“商品-品牌-客户-订单-订单项”为例&#xff0c;带你快速入门数据库的核心知识和基本操…

GeoServer样式设置:使用本地图标及分层/分视野显示

GeoServer样式设置:使用本地图标及分层/分视野显示 1、本地图标生效设置2、GeoServer添加不同视野的图标点样式1)服务预览效果2)本地图标引用3)不同视野显示不同图标4)标注注记显示空间的点数据,使用图标来表示是非常常见的业务需求,而且由于在不同比例尺下,可能需要设…

DL00347-基于人工智能YOLOv11的安检X光危险品刀具检测含数据集

&#x1f6a8; AI技术革新&#xff0c;提升安检效率与安全性&#xff01;YOLOv11助力X光危险品刀具检测&#xff01; &#x1f4a1; 在安全领域&#xff0c;效率与精准度的要求从未如此迫切。作为科研人员&#xff0c;是否一直在寻找一款可以提升安检准确率、减少人工干预、提…

测试计划与用例撰写指南

测试计划与用例撰写指南 一、测试计划&#xff1a;项目测试的 “导航地图”1.1 测试计划的核心目标 1.2 测试计划的关键要素 1.2.1 项目概述 1.2.2 测试策略 1.2.3 资源与进度 1.2.4 风险评估与应对 二、测试用例&#xff1a;测试执行的 “行动指南”2.1 测试用例的设计原则 2…

微服务的应用案例

从“菜市场”到“智慧超市”&#xff1a;一场微服务的变革之旅 曾经&#xff0c;我们的系统像一个熙熙攘攘的传统菜市场。所有功能模块&#xff08;摊贩&#xff09;都挤在一个巨大的单体应用中。用户请求&#xff08;买菜的顾客&#xff09;一多&#xff0c;整个市场就拥堵不堪…

Java设计模式之观察者模式:从基础到高级的全面解析

文章目录 一、观察者模式基础概念1.1 什么是观察者模式?1.2 观察者模式的四大角色1.3 观察者模式类图二、观察者模式实现步骤2.1 基础实现步骤2.2 详细代码实现第一步:定义主题接口第二步:定义观察者接口第三步:创建具体主题第四步:创建具体观察者第五步:客户端使用三、观…

GATT 服务的核心函数bt_gatt_discover的介绍

目录 概述 1 GATT 基本概念 1.1 GATT 的介绍 1.2 GATT 的角色 1.3 核心组件 1.4 客户端操作 2 bt_gatt_discover函数的功能和应用 2.1 函数介绍 2.1 发现类型&#xff08;Discover Type&#xff09; 3 典型使用流程 3.1 服务发现示例 3.2 级联发现模式 3.3 按UUID过…

【更新至2023年】1985-2023年全国及各省就业人数数据(无缺失)

1985-2023年全国及各省就业人数数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1985-2023年 2、来源&#xff1a;Z国统计年鉴、各省年鉴、新中国60年 3、指标&#xff1a;就业人数 4、范围&#xff1a;全国及31省 5、缺失情况&#xff1a;无缺失 6、指标解释&am…