創建一個簡易的風扇動畫界面:基于 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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82357.shtml
英文地址,請注明出處:http://en.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…