WPF案例(二)模拟Apple OS 界面前后180度反转

简介: 原文:WPF案例(二)模拟Apple OS 界面前后180度反转    我们在设计应用程序界面的时候,为了充分利用界面空间,住住需要灵活的界面布局方式,比如可以在界面正面空间上定义一个Chart,背面空间上定义一个GridView,通过在Chart上鼠标双击,控件180度旋转后向用户显示出界面背面...
原文: WPF案例(二)模拟Apple OS 界面前后180度反转

    我们在设计应用程序界面的时候,为了充分利用界面空间,住住需要灵活的界面布局方式,比如可以在界面正面空间上定义一个Chart,背面空间上定义一个GridView,通过在Chart上鼠标双击,控件180度旋转后向用户显示出界面背面的GridView,通过在GridView上双击鼠标,控件再一次平滑的180度旋转向用户显示正面的Chart

   这个例子就是使用Wpf模拟Apple OS 实现一个包含正反面元素的控件以Y轴为坐标前后180翻转的动画效果,在这里为方便示例,在正反面各以一个Image来表示,在每一面的Image上双击鼠标,Image将180度反转,显示出背面的另一幅Image,下面是示例界面的缩略图,有兴趣的朋友可以下载源码

    

   在这个示例中主要采用了GeometryModel3D和VisualBrush这两个元素,GeometryModel3D用来在3D场景中建立几何模型,在Wpf中,任何复杂的3D模型最终都是由多个基本基元组成的,最小的基本基元被定义为由三个顶点连线组成的三角形,几何模型的每一面就是由多个这样的三角形的三维基元组合而成的。

   在Wpf中通过

img_405b18b4b6584ae338e0f6ecaf736533.gif GeomertyModel3D的定义
 1    < GeometryModel3D >
 2             < GeometryModel3D.Geometry >
 3                   < MeshGeometry3D  TriangleIndices ="0,1,2 2,3,0"  TextureCoordinates ="0,1 1,1 1,0 0,0"  
 4                           Positions ="-0.5,-0.5,0 0.5,-0.5,0 0.5,0.5,0 -0.5,0.5,0"   />
 5             </ GeometryModel3D.Geometry >
 6              < GeometryModel3D.Material >
 7                  < DiffuseMaterial >
 8                      < DiffuseMaterial.Brush >
 9                             < VisualBrush  Visual =" {Binding ElementName=frontHost} "   />
10                       </ DiffuseMaterial.Brush >
11                   </ DiffuseMaterial >
12               </ GeometryModel3D.Material >
13                < GeometryModel3D.BackMaterial >
14                    < DiffuseMaterial >
15                         < DiffuseMaterial.Brush >
16                              < VisualBrush  Visual =" {Binding ElementName=backHost} " >
17                                    < VisualBrush.RelativeTransform >
18                                          < ScaleTransform  ScaleX ="-1"  CenterX ="0.5"   />
19                                    </ VisualBrush.RelativeTransform >
20                                           </ VisualBrush >
21                               </ DiffuseMaterial.Brush >
22                     </ DiffuseMaterial >
23               </ GeometryModel3D.BackMaterial >
24                < GeometryModel3D.Transform >
25                     < RotateTransform3D >
26                           < RotateTransform3D.Rotation >
27                                  < AxisAngleRotation3D  x:Name ="rotate"  Axis ="0,1,0"  Angle ="0"   />
28                            </ RotateTransform3D.Rotation >
29                      </ RotateTransform3D >
30                 </ GeometryModel3D.Transform >
31     </ GeometryModel3D >

    对GometryModel3D的前后反转定义动画,在Wpf中,Viewport2DVisual3D用来在3D场景中宿主2D控件,因此只要把Image宿主在Viewport2DVisual3D中,就可以在直接在3D场景中反转Image,但这不是一个好的方法,因为如果宿主一个比较复杂,比较"重"的2D控件到Viewport2DVisual3D,并在3D场景中对它应用动画,将使动画的画面出现停顿,因此一个好的解决方法是用VisualBrush将2D控件的实时图像刷新到GometryModel3D的表面Material上,这样可使2D控件不用直接参于到3D场景中去,通过显示隐藏相关元素一样可以实现反转界面的动画效果

img_405b18b4b6584ae338e0f6ecaf736533.gif Storyboard的定义
 1  < Storyboard  x:Key ="FrontClick" >
 2               < ObjectAnimationUsingKeyFrames  Storyboard.TargetName ="Viewport3D"  
 3                           Storyboard.TargetProperty ="Visibility" >
 4                   < DiscreteObjectKeyFrame  KeyTime ="0:0:0"  Value =" {x:Static Visibility.Visible} "   />
 5                   < DiscreteObjectKeyFrame  KeyTime ="0:0:1.1"  Value =" {x:Static Visibility.Hidden} "   />
 6               </ ObjectAnimationUsingKeyFrames >
 7               < ObjectAnimationUsingKeyFrames  Storyboard.TargetName ="backWrapper"  
 8                         Storyboard.TargetProperty ="Visibility" >
 9                   < DiscreteObjectKeyFrame  KeyTime ="0:0:1"  Value =" {x:Static Visibility.Visible} " />
10               </ ObjectAnimationUsingKeyFrames >
11               < ObjectAnimationUsingKeyFrames  Storyboard.TargetName ="frontWrapper"  
12                         Storyboard.TargetProperty ="Visibility" >
13                   < DiscreteObjectKeyFrame  KeyTime ="0:0:0.05"  Value =" {x:Static Visibility.Hidden} "   />
14               </ ObjectAnimationUsingKeyFrames >
15               < DoubleAnimation  To ="0"  Duration ="0:0:0.05"  Storyboard.TargetName ="frontWrapper"  
16                        Storyboard.TargetProperty ="Opacity"   />
17               < DoubleAnimation  BeginTime ="0:0:1.05"  Duration ="0:0:0.05"  To ="1"  
18                        Storyboard.TargetName ="backWrapper"  Storyboard.TargetProperty ="Opacity"   />
19               < Point3DAnimation  To ="0,0,1.1"  From ="0,0,0.5"  BeginTime ="0:0:0.05"  Duration ="0:0:0.5"  
20                            AutoReverse ="True"  DecelerationRatio ="0.3"  Storyboard.TargetName ="camera"  
21                       Storyboard.TargetProperty ="(PerspectiveCamera.Position)"   />
22               < DoubleAnimation  From ="0"  To ="180"  AccelerationRatio ="0.3"  DecelerationRatio ="0.3"  
23                      BeginTime ="0:0:0.05"  Duration ="0:0:1"  Storyboard.TargetName ="rotate"  Storyboard.TargetProperty ="Angle"   />
24           </ Storyboard >
25           < Storyboard  x:Key ="BackClick"   >
26               < ObjectAnimationUsingKeyFrames  Storyboard.TargetName ="Viewport3D"
27                       Storyboard.TargetProperty ="Visibility" >
28                   < DiscreteObjectKeyFrame  KeyTime ="0:0:0"  Value =" {x:Static Visibility.Visible} "   />
29                   < DiscreteObjectKeyFrame  KeyTime ="0:0:1.1"  Value =" {x:Static Visibility.Hidden} "   />
30               </ ObjectAnimationUsingKeyFrames >
31               < ObjectAnimationUsingKeyFrames  Storyboard.TargetName ="frontWrapper"  
32                       Storyboard.TargetProperty ="Visibility" >
33                   < DiscreteObjectKeyFrame  KeyTime ="0:0:1"  Value =" {x:Static Visibility.Visible} " />
34               </ ObjectAnimationUsingKeyFrames >
35               < ObjectAnimationUsingKeyFrames  Storyboard.TargetName ="backWrapper"  
36                         Storyboard.TargetProperty ="Visibility" >
37                   < DiscreteObjectKeyFrame  KeyTime ="0:0:0.05"  Value =" {x:Static Visibility.Hidden} "   />
38               </ ObjectAnimationUsingKeyFrames >
39               < DoubleAnimation  To ="0"  Duration ="0:0:0.05"  Storyboard.TargetName ="backWrapper"
40                          Storyboard.TargetProperty ="Opacity"   />
41               < DoubleAnimation  BeginTime ="0:0:1.05"  Duration ="0:0:0.05"  
42                          Storyboard.TargetName ="frontWrapper"  Storyboard.TargetProperty ="Opacity"   />
43               < Point3DAnimation  To ="0,0,1.1"  From ="0,0,0.5"  BeginTime ="0:0:0.05"  
44                           Duration ="0:0:0.5"  AutoReverse ="True"  DecelerationRatio ="0.3"  Storyboard.TargetName ="camera"   
                            oryboard.TargetProperty ="(PerspectiveCamera.Position)"   />
45               < DoubleAnimation  From ="180"  To ="360"  AccelerationRatio ="0.3"  
46                            DecelerationRatio ="0.3"  BeginTime ="0:0:0.05"  Duration ="0:0:1"  
47                            Storyboard.TargetName ="rotate"  Storyboard.TargetProperty ="Angle"   />
48  </ Storyboard >
目录
相关文章
|
9月前
|
存储 Java C语言
MacOS环境-手写操作系统-08-C语言调色板(绘制系统界面)
本文介绍了如何使用C语言在系统界面中应用调色板,通过向硬件发送指令改变颜色显示模式。首先,定义了16种基本颜色并存储在数组中,然后通过关闭中断、写入调色板号和RGB颜色值来更新调色板。接着,展示了如何编译和反汇编C代码,最后通过汇编语言将调色板数据发送给硬件,并实现在屏幕上绘制方块。整个过程涉及到中断处理、端口操作和图形绘制技术。 摘要由CSDN通过智能技术生成
92 3
|
9月前
|
Ubuntu Java C语言
MacOS环境-手写操作系统-07-C语言绘制系统界面
MacOS环境-手写操作系统-07-C语言绘制系统界面
64 1
|
11月前
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
|
10月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
293 3
|
11月前
|
C# UED 开发者
WPF动画大揭秘:掌握动画技巧,让你的界面动起来,告别枯燥与乏味!
【8月更文挑战第31天】在WPF应用开发中,动画能显著提升用户体验,使其更加生动有趣。本文将介绍WPF动画的基础知识和实现方法,包括平移、缩放、旋转等常见类型,并通过示例代码展示如何使用`DoubleAnimation`创建平移动画。此外,还将介绍动画触发器的使用,帮助开发者更好地控制动画效果,提升应用的吸引力。
515 0
|
11月前
|
容器 C# 开发者
XAML语言大揭秘:WPF标记的魅力所在,让你轻松实现界面与逻辑分离,告别复杂代码!
【8月更文挑战第31天】XAML提供了一种直观且易于维护的界面设计方式,使得开发者可以专注于逻辑和业务代码的编写,而无需关心界面细节。通过数据绑定、布局管理和动画效果等特性,XAML可以实现丰富的界面交互和视觉效果。在实际开发过程中,开发者应根据具体需求选择合适的技术方案,以确保应用程序能够满足用户的需求。希望本文的内容能够帮助您在WPF应用程序开发中更好地利用XAML语言。
114 0
|
11月前
|
数据处理 开发者 C#
WPF数据绑定实战:从零开始,带你玩转数据与界面同步,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,数据绑定是核心技能之一,它能实现界面元素与数据源的同步更新。本文详细介绍了WPF数据绑定的概念与实现方法,包括属性绑定、元素绑定及路径绑定等技术,并通过示例代码展示了如何创建数据绑定。通过数据绑定,开发者不仅能简化代码、提高可维护性,还能提升用户体验。无论初学者还是有经验的开发者,都能从中受益,更好地掌握WPF数据绑定技巧。
208 0
|
11月前
|
存储 前端开发 C#
WPF/C#:更改界面的样式
WPF/C#:更改界面的样式
127 0
|
前端开发 算法 JavaScript
走进WPF之MVVM完整案例
走进WPF之MVVM完整案例
421 0

推荐镜像

更多