WPF学习(动画)

文章目录

  • 一、图像变换 RenderTransform
      • 1、常见变换类型
      • 2、`RenderTransform` 的核心作用
      • 3、`RenderTransform` 的使用方式
      • 4、与 `LayoutTransform` 的对比
      • 5、在动画中的应用
  • 二、 滚动的椭圆
  • 三、Storyboard放置位置
      • 1. **元素的 `Resources` 集合**
      • 2. **控件模板(`ControlTemplate`)或数据模板(`DataTemplate`)中**
      • 3. **窗口(`Window`)或页面(`Page`)的资源**
      • 4. **应用程序资源(`App.xaml`)**
      • 5. **代码动态创建**
      • 选择建议
        • 示例代码: 旋转的按钮

一、图像变换 RenderTransform

在WPF中,RenderTransform 是一个重要的属性,用于对UI元素进行变换(Transformation),即在不改变元素实际位置和大小的情况下,改变其视觉呈现效果。常见的变换包括旋转、缩放、平移和倾斜
Render:使成为某种状态,使成为

1、常见变换类型

WPF提供了多种变换类,每种对应不同的效果:

变换类作用关键属性
RotateTransform旋转元素Angle(旋转角度,单位:度)
ScaleTransform缩放元素ScaleXScaleY(水平/垂直缩放比例)
TranslateTransform平移元素(相对移动)XY(平移距离)
SkewTransform倾斜元素AngleXAngleY(水平/垂直倾斜角度)
MatrixTransform自定义矩阵变换(高级用法)Matrix(变换矩阵)

2、RenderTransform 的核心作用

  1. 视觉效果增强
    通过变换可以创建动画、特效或调整元素的显示方式,而不影响布局系统。
    例如:旋转按钮、放大图像、倾斜文本等。

  2. 独立于布局
    变换只影响元素的渲染结果,不会改变元素在布局中的位置或占用空间。
    例如:将按钮旋转45度后,它仍占据原来的矩形区域。

  3. 组合多种变换
    可以通过 TransformGroup 组合多个变换,按顺序应用效果。

3、RenderTransform 的使用方式

  1. 单一变换示例(旋转)
<Button Content="旋转按钮" Width="100" Height="30"><Button.RenderTransform><RotateTransform Angle="45" CenterX="50" CenterY="15" /></Button.RenderTransform>
</Button>
  • CenterXCenterY:指定旋转中心点(相对于元素左上角)。
  1. 组合变换示例(缩放 + 旋转)
<Ellipse Width="50" Height="50" Fill="Blue"><Ellipse.RenderTransform><TransformGroup><ScaleTransform ScaleX="1.5" ScaleY="0.8" /><RotateTransform Angle="30" /></TransformGroup></Ellipse.RenderTransform>
</Ellipse>
  • 变换按顺序应用:先缩放,再旋转。

4、与 LayoutTransform 的对比

WPF中还有一个 LayoutTransform 属性,两者的区别如下:

属性作用范围对布局的影响性能
RenderTransform仅影响元素的渲染结果不影响布局(占位不变)较高(仅重绘)
LayoutTransform影响元素的布局计算改变元素占用空间较低(触发布局更新)

5、在动画中的应用

RenderTransform 常与动画结合使用,实现动态效果。例如:

<Button Content="动画按钮" Width="100"><Button.RenderTransform><RotateTransform x:Name="buttonRotate" Angle="0" /></Button.RenderTransform>
</Button><!-- 动画定义 -->
<Storyboard x:Key="RotateAnimation"><DoubleAnimation Storyboard.TargetName="buttonRotate"Storyboard.TargetProperty="Angle"From="0" To="360" Duration="0:0:2"RepeatBehavior="Forever" />
</Storyboard>

六、注意事项

  1. 变换中心(Center)
    多数变换需要指定中心点(如旋转、缩放),默认值为 (0, 0)(元素左上角)。合理设置中心点可避免元素“漂移”。

  2. 性能考虑
    频繁使用复杂变换(尤其是 MatrixTransform)可能影响性能,建议适度使用。

  3. 坐标系
    变换基于元素自身的坐标系,而非父容器或全局坐标系。

总结
RenderTransform 是WPF中实现元素视觉变换的核心机制,通过它可以轻松创建旋转、缩放、平移等效果,为UI增添动态和交互性。结合动画系统,更能实现复杂的视觉过渡效果。

二、 滚动的椭圆

在这里插入图片描述
示例代码

<Window x:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Ellipse Center 动画示例" Height="300" Width="400"><Grid><!-- 定义动画资源 --><Grid.Resources><Storyboard x:Key="RollingAnimation" RepeatBehavior="Forever"><!-- 水平移动动画 --><DoubleAnimation Storyboard.TargetName="MyEllipse"Storyboard.TargetProperty="(Canvas.Left)"From="0" To="300" Duration="0:0:5"AutoReverse="True" /><!-- 旋转动画 - 模拟滚动效果 --><DoubleAnimation Storyboard.TargetName="EllipseRotateTransform"Storyboard.TargetProperty="Angle"From="0" To="360" Duration="0:0:1"RepeatBehavior="Forever" /></Storyboard></Grid.Resources><!-- 触发动画 --><Grid.Triggers><EventTrigger RoutedEvent="FrameworkElement.Loaded"><BeginStoryboard Storyboard="{StaticResource RollingAnimation}" /></EventTrigger></Grid.Triggers><!-- 椭圆路径 --><Canvas><Path Grid.Row="1" Stroke="red" StrokeThickness="2" x:Name="MyEllipse" Canvas.Left="0" Canvas.Top="100"><Path.RenderTransform><RotateTransform x:Name="EllipseRotateTransform" CenterX="100" CenterY="100" /></Path.RenderTransform><Path.Data><EllipseGeometry Center="100,100" RadiusX="50" RadiusY="20"/></Path.Data></Path></Canvas></Grid></Window>

三、Storyboard放置位置

在WPF(Windows Presentation Foundation)中,Storyboard 是用于定义和控制动画的对象。它可以放在多个不同的位置,具体取决于你的使用场景和动画的作用范围。以下是常见的几种放置位置及其适用情况:

1. 元素的 Resources 集合

Storyboard 定义在元素的资源字典中,使其仅对该元素及其子元素可用。这种方式适合局部动画,例如按钮点击效果、控件加载动画等。

示例(按钮悬停动画)

<Button Content="Hover Me"><Button.Resources><Storyboard x:Key="HoverStoryboard"><DoubleAnimationStoryboard.TargetProperty="Opacity"From="1.0" To="0.7" Duration="0:0:0.3"AutoReverse="True"/></Storyboard></Button.Resources><Button.Triggers><EventTrigger RoutedEvent="Button.MouseEnter"><BeginStoryboard Storyboard="{StaticResource HoverStoryboard}"/></EventTrigger></Button.Triggers>
</Button>

2. 控件模板(ControlTemplate)或数据模板(DataTemplate)中

当需要为自定义控件或数据项定义动画时,可以将 Storyboard 放在模板的资源中。这种方式适合封装在控件内部的动画逻辑。

示例(自定义按钮模板动画)

<Style TargetType="Button"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border x:Name="border" Background="{TemplateBinding Background}"><ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/></Border><ControlTemplate.Resources><Storyboard x:Key="PressAnimation"><ColorAnimationStoryboard.TargetName="border"Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"To="LightBlue" Duration="0:0:0.2"/></Storyboard></ControlTemplate.Resources><ControlTemplate.Triggers><EventTrigger RoutedEvent="Button.PreviewMouseDown"><BeginStoryboard Storyboard="{StaticResource PressAnimation}"/></EventTrigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter>
</Style>

3. 窗口(Window)或页面(Page)的资源

Storyboard 定义在窗口或页面的资源字典中,使其对整个窗口或页面内的所有元素可用。这种方式适合应用于多个控件的共享动画。

示例(窗口级别的共享动画)

<Window.Resources><Storyboard x:Key="FadeInStoryboard"><DoubleAnimationStoryboard.TargetProperty="Opacity"From="0" To="1" Duration="0:0:0.5"/></Storyboard>
</Window.Resources><StackPanel><Button Content="Animate" Click="Button_Click"/><TextBlock x:Name="message" Text="Hello"/>
</StackPanel>

在代码-behind中启动动画:

private void Button_Click(object sender, RoutedEventArgs e) {Storyboard sb = (Storyboard)FindResource("FadeInStoryboard");Storyboard.SetTarget(sb, message);sb.Begin();
}

4. 应用程序资源(App.xaml

对于全局共享的动画(如全局过渡效果、应用程序启动动画),可以将 Storyboard 定义在应用程序的资源字典中。

示例(应用程序级别的动画)

<Application.Resources><Storyboard x:Key="GlobalHighlightAnimation"><ColorAnimationStoryboard.TargetProperty="(Control.Background).(SolidColorBrush.Color)"To="Yellow" Duration="0:0:0.5" AutoReverse="True"/></Storyboard>
</Application.Resources>

5. 代码动态创建

在某些情况下(如需要动态生成动画参数),可以在代码中动态创建 Storyboard 并应用到元素上。

示例(动态创建动画)

// 创建动画
DoubleAnimation animation = new DoubleAnimation {From = 0,To = 100,Duration = TimeSpan.FromSeconds(1)
};// 创建 Storyboard 并设置目标属性
Storyboard storyboard = new Storyboard();
storyboard.Children.Add(animation);
Storyboard.SetTargetProperty(animation, new PropertyPath(Button.WidthProperty));
Storyboard.SetTarget(animation, myButton);// 启动动画
storyboard.Begin();

选择建议

  • 局部动画:放在元素资源或模板中。
  • 共享动画:放在窗口/页面资源或应用程序资源中。
  • 动态动画:在代码中创建。

无论放在何处,确保 Storyboard 的作用范围与动画的使用场景相匹配,以提高代码的可维护性和复用性。

示例代码: 旋转的按钮

鼠标放到上面会自动旋转
在这里插入图片描述

<Window x:Class="WpfApp1.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:WpfApp1"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><Button Content="动画按钮" Width="100" Height="60"><Button.RenderTransform><RotateTransform x:Name="buttonRotate" Angle="0" /></Button.RenderTransform><Button.Resources><Storyboard x:Key="RotateAnimation"><DoubleAnimation Storyboard.TargetName="buttonRotate"Storyboard.TargetProperty="Angle"From="0" To="360" Duration="0:0:6"RepeatBehavior="Forever" /></Storyboard></Button.Resources><Button.Triggers><EventTrigger RoutedEvent="Button.MouseEnter"><BeginStoryboard Storyboard="{StaticResource RotateAnimation}"/></EventTrigger></Button.Triggers></Button></Grid>
</Window>

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

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

相关文章

Crossbar结构的排队策略

目录 一、概述 二、排队策略 三、输入排队结构(IQ) 3.1 结构特点 3.2 改进方案 四、输出排队结构&#xff08;OQ&#xff09; 五、输入输出联合排队结构(CIOQ) 六、输入交叉节点联合排队结构(CICQ) 一、概述 Crossbar是一种全连接的交换结构&#xff0c;由 MN 个交叉…

状态模式 - Flutter中的状态变身术,让对象随“状态“自由切换行为!

订单状态流转/播放器控制/游戏角色行为…一个模式搞定所有状态驱动型逻辑&#xff01; 经典场景&#xff1a;订单状态管理 假设你在开发一个外卖App&#xff0c;订单有以下状态&#xff1a; 等待接单已接单配送中已完成已取消 每个状态下&#xff1a; 显示的UI不同可执行的…

数据库9:数据库字符编码调整与校队(排序)规则

一.常用字符编码 1.ASCII编码 用一个字节表示一个字符 2.ANSI编码 每个国家为了显示本国的语言而对ASCII码进行了拓展 用两个字节表示一个汉字&#xff0c;中国的ANSI编码是GB2312编码&#xff08;简体&#xff09;&#xff0c;日本的ANSI编码是JIS编码&#xff0c;台湾的A…

人脸活体识别4:Android实现人脸眨眼 张嘴 点头 摇头识别(可实时检测)

人脸活体识别4&#xff1a;Android实现人脸眨眼 张嘴 点头 摇头识别(可实时检测) 目录 人脸活体识别4&#xff1a;Android实现人脸眨眼 张嘴 点头 摇头识别(可实时检测) 1. 前言 2.人脸活体识别方法 &#xff08;1&#xff09;基于人脸动作的检测​​ &#xff08;2&…

DAY1-Linux操作系统1

文章参考【黑马程序员Python教程_600集Python从入门到精通教程&#xff08;懂中文就能学会&#xff09;】 https://www.bilibili.com/video/BV1ex411x7Em/?p40&share_sourcecopy_web&vd_source263bbee2ddeb835c3ab6d9d3c80e0f7c 一.常用命令简单介绍 使用软件 虚拟机…

第十二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - 两种权限控制方式(附前后端代码)

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入…

华为云Flexus+DeepSeek征文 | 华为云 ModelArts Studio 赋能 AI 法务:合同审查与法律文件生成系统

一、引言 在法律行业数字化转型的浪潮中&#xff0c;AI 技术正重塑法律服务的流程与效率。本文介绍如何利用华为云 ModelArts Studio 构建一套完整的 AI 法务系统&#xff0c;实现合同审查、法律文件生成、法律咨询与风险识别的智能化解决方案。 二、系统架构设计 &#xff0…

SQL的底层逻辑解析

SQL的底层逻辑涉及数据库管理系统(DBMS)如何解析、优化和执行SQL查询&#xff0c;主要包括以下几个层面&#xff1a; ​查询处理流程​ 解析器(Parser)&#xff1a;将SQL语句转换为语法树查询优化器(Optimizer)&#xff1a;基于统计信息和成本模型生成最优执行计划执行引擎(Exe…

深入剖析AI大模型:PyTorch 技术详解

今天说一说PyTorch。作为一名python程序员&#xff0c;可能对它了解起来还是很快的。在人工智能浪潮席卷全球的当下&#xff0c;深度学习作为其核心技术&#xff0c;被广泛应用于图像识别、自然语言处理、语音识别等多个领域。而在深度学习的开发框架中&#xff0c;PyTorch 凭借…

物联网架构:定义、解释和实例

物联网&#xff08;IoT&#xff09;架构是一个复杂且多维度的概念&#xff0c;构成了物联网系统的核心框架。它是勾勒物联网设备、应用程序和技术如何相互交互以实现预期功能的蓝图。物联网架构并非 “一刀切” 的模型&#xff0c;而是会根据相关物联网系统的具体需求而有所不同…

拿到一台新服务器,怎么跑AI项目

公司新采购一台AI服务器&#xff0c;花大本钱装了个A6000显卡&#xff0c;今天来记录下新服务的使用步骤。 1、查看系统。 这台服务器预装了Ubuntu20.04系统。 lsb_release -a 查看下cpu、内存情况 top 看着还行。 再看下硬盘空间 df -h 空间不算小&#xff0c;2T。 2、…

IO--进程实操

1.创建一个进程扇 #include <051head.h> int main(int argc, const char *argv[]) {pid_t pid;for(int i0;i<4;i){pidfork();if(pid-1) //父进程{ERRLOG("fork error..\n");} else if(pid0) //这是子进程{ …

模型预测控制(MPC)概览

模型预测控制&#xff08;Model Predictive Control, MPC&#xff09; 一、理论基础与发展脉络 1. 历史起源 20世纪70年代起源于工业过程控制&#xff08;如化工领域的动态矩阵控制DMC、模型算法控制MAC&#xff09;&#xff0c;由Richalet、Mehra等学者提出&#xff0c;核心…

Python初体验:从入门到实践

Python无疑是开启编程世界大门的绝佳钥匙。今天,就让我们一起踏上Python的学习之旅。 #01 编写第一个Python程序 环境搭建好之后,上节已经编写了第一个Python程序。现在就好比,我们已经准备好了厨房和食材,要开始做第一道菜了。启动Jupyter后,在Jupyter中新建一个文件,…

【数字后端】- 什么是AOI、OAI cell?它们后面数字的含义

是什么&#xff1f; 不管是在DC综合阶段&#xff0c;还是在PR阶段&#xff0c;尝尝会出现OAI、AOI组合逻辑单元的身影。因为它们可以通过巧妙的串联和并联晶体管非常高效地实现组合逻辑&#xff0c;因此在VLSI设计中非常常用。但是它们也是高pin密度单元&#xff0c;也可能会造…

MQTTServer服务器根据MQTTClient客户端已订阅的主题推送 分发消息

网络读卡器介绍&#xff1a;https://item.taobao.com/item.htm?ftt&id22173428704&spma21dvs.23580594.0.0.52de2c1bgK3bgZ 本示例使用了MQTTNet插件 C# MQTTNETServer 源码 using MQTTnet.Client.Receiving; using MQTTnet.Server; using MQTTnet; using System; u…

【seismic unix 合并两个su文件】

Seismic Unix简介 Seismic Unix&#xff08;SU&#xff09;是由科罗拉多矿业学院开发的开源地震数据处理软件包&#xff0c;基于Unix/Linux环境运行。它提供了一系列命令行工具&#xff0c;用于地震数据加载、处理、分析和可视化&#xff0c;支持SEG-Y格式和SU自定义格式。SU广…

【vmware虚拟机使用】安装vmware workstations17

安装vmware17 本章学习目标VMware虚拟机简介开始实操下载VMware workstation虚拟机安装虚拟机配置虚拟机网络 总结 本章学习目标 1.安装vmware workstation虚拟机 2.自定义配置虚拟机网络&#xff0c;避免网络冲突 VMware虚拟机简介 ​ VMware的核心是Hypervisor&#xff0…

QT6 源(147)模型视图架构里的表格窗体 QTableWidget 的范例代码举例,以及其条目 QTableWidgetItem 类型的源代码。

&#xff08;1&#xff09;先用一个简单的例子&#xff0c;学习一下本类里的成员函数的使用。生成如下图的界面&#xff0c;表格窗体与初始数据&#xff1a; 查看其 ui_widget . h 文件 &#xff0c;里面的将是最标准的表格窗体的使用代码 &#xff1a; #ifndef UI_WIDGET_H #…

URL时间戳参数深度解析:缓存破坏与前端优化的前世今生

&#x1f50d; URL时间戳参数深度解析&#xff1a;缓存破坏与前端优化的前世今生 在日常的Web开发中&#xff0c;你是否注意到很多接口URL后面都会带有一个时间戳参数&#xff1f;比如 xxx/getMsg?_1751413509056。这个看似简单的参数背后&#xff0c;却隐藏着前端缓存策略、性…