WPF(C#) 矩阵拖动、矩阵动画、边缘展开动画处理。
最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画。之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来:
我的开发环境是在VS2017下进行的,这个工具条主要功能是:一个工具条,可进行拖拉。可进行拖拉展开,可在拖动之后不足展开并反向继续展开剩下的部分;
一、【拖动】 拖动的核心代码是通过矩阵进行定位和拖动的,定位是以父容器为模板的。以下是核心代码(及效果图):
1 /// <summary>
2 /// 这里TitleBar代指最顶上的操作Bar
3 /// 桌面模式下默认展开工具栏-动画
4 /// </summary>
5 private void DesktopToolWindowClick()
6 {
7
8
9 //添加行为
10 var behaviors = System.Windows.Interactivity.Interaction.GetBehaviors(this);
11 behaviors.Clear();
12
13 behaviors = System.Windows.Interactivity.Interaction.GetBehaviors(this);
14 behaviors.Clear();
15
16
17 //添加拖拉事件
18 this._OnMouse = new MoveInContainerBehavior(MoveInContainerBehavior.MoveModes.Free, new Rect(0, 0, WindowsWidth, WindowsHeight));
19 behaviors.Add(this._OnMouse);
20 }
21
22 /// <summary>
23 /// 加载用户控件的时候订阅事件
24 /// </summary>
25 private void _OnRegisterUserControl()
26 {
27
28 //订阅鼠标按下控件的事件;
29 _OnMouse.MouseLeftButtonDown += new MoveInContainerBehavior.MouseLeftButtonDownEventHandler(_OnMouseDownEvent);
30 //订阅鼠标拖动控件的事件;
31 _OnMouse.MouseMove += new MoveInContainerBehavior.MouseMoveEventHandler(_OnMouseMoveEvent);
32 //订阅鼠标释放控件的事件;
33 _OnMouse.MouseLeftButtonUp += new MoveInContainerBehavior.MouseLeftButtonUpEventHandler(_OnMouseReleseEvent);
34
35 }
36
37 /// <summary>
38 /// 用该事件控制弹窗位置
39 /// </summary>
40 /// <param name="sender"></param>
41 /// <param name="e"></param>
42 private void _ToolBar_Opened(object sender, EventArgs e)
43 {
44 //计算出控件移动的距离
45 var Windows_Lengh = _UserControl_XEnd + this.PopMenu.ActualWidth;
46 if (this._UserControl.ActualWidth + Windows_Lengh >= WindowsWidth)
47 {
48 this._ToolBar.Placement = System.Windows.Controls.Primitives.PlacementMode.Left;
49 this._ToolBar.HorizontalOffset = -5;
50 }
51 else
52 {
53 this._ToolBar.Placement = System.Windows.Controls.Primitives.PlacementMode.Right;
54 this._ToolBar.HorizontalOffset = 5;
55 }
56 }
二、【拖拉改变样式】 通过样式库调用可以在动画开始的时候就更换主题样式通过backup更改样式而不是UI直接改变,以下是核心代码(及效果图):
1 #region 更改样式为【展开时候的样式】
2 this._GridMain.Margin = new Thickness(0, -46, 0, 0);
3 this._GridRowsF.Height = new GridLength(47);
4 this.TitleBar.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4a94ff"));
5 this.TitleBar.Opacity = 1;
6 this.TitleBar.Margin = new Thickness(-7, -3, -7, 0);
7 this.Circle_Bar.Stroke = Brushes.White;
8 this.Circle_Bar.Margin = new Thickness(0, -3, 0, 0);
9 this._UserControl.Style = this.FindResource("Style.UserControl.PresentationMode.Desktop.Expand.UserControlStyles") as Style;
10 #endregion
三、【拖拉展开-边缘充足】 进行一个动画 那就是直接按照自定义的动画时间进行展开,以下是核心代码(及效果图)使用GridLengthAnimation动画类自行百度,下面是经过二次编译的类调用方法:
1 #region 尝试展开工具条--向下展开 2 GridLengthAnimation ExpandAnimate = new GridLengthAnimation(); 3 ExpandAnimate.From = new GridLength(0, GridUnitType.Pixel); 4 ExpandAnimate.To = new GridLength(_GridRowsSLength, GridUnitType.Pixel); 5 ExpandAnimate.Duration = TimeSpan.FromSeconds(0.3); 6 ExpandAnimate.AutoReverse = false; 7 this._GridMain.RowDefinitions[1].BeginAnimation(RowDefinition.HeightProperty, ExpandAnimate); 8 9 10 11 12 #endregion
四、【拖拉展开-边缘不足】 进行两个动画 1-先展开到边缘动画 2-再反弹反方向展开动画,以下是核心代码(及效果图):
1 #region 先往下展开,展开结束之后再启用往上增加动画
2 GridLengthAnimation ExpandAnimate = new GridLengthAnimation();
3 ExpandAnimate.From = new GridLength(0, GridUnitType.Pixel);
4 ExpandAnimate.To = new GridLength(WindowsHeight - ParentPoint.Y - 68, GridUnitType.Pixel);
5 ExpandAnimate.Duration = TimeSpan.FromSeconds(0.15);
6 ExpandAnimate.AutoReverse = false;
7 ExpandAnimate.Completed += StartMatrixExpandAnimate_Completed;
8 this._GridMain.RowDefinitions[1].BeginAnimation(RowDefinition.HeightProperty, ExpandAnimate);
9
10 #endregion
11
12 /// <summary>
13 /// 当展开动画结束之后开始执行反向动画
14 /// </summary>
15 /// <param name="sender"></param>
16 /// <param name="e"></param>
17 private void StartMatrixExpandAnimate_Completed(object sender, EventArgs e)
18 {
19 //删除动画
20 this._GridMain.RowDefinitions[1].BeginAnimation(RowDefinition.HeightProperty, null);
21
22 #region 向上移动动画
23 // 1-向上移动
24 Storyboard storyboard = new Storyboard();
25 storyboard.FillBehavior = FillBehavior.Stop;
26 MatrixTransform matrixTransformOfOwner = this.RenderTransform as MatrixTransform;
27 if (matrixTransformOfOwner == null)
28 {
29 matrixTransformOfOwner = new MatrixTransform(this.RenderTransform.Value);
30 this.RenderTransform = matrixTransformOfOwner;
31 }
32 this._oldTransform = this.RenderTransform;
33 Matrix matrixOfOwner = this.RenderTransform.Value;
34 Matrix fromMatrix = matrixOfOwner;
35 Matrix toMatrix = new Matrix();
36 toMatrix.OffsetX = ParentPoint.X;
37 toMatrix.OffsetY = WindowsHeight - _GridRowsSLength - 68;
38
39 MatrixAnimation matrixAnimation = new MatrixAnimation(fromMatrix, toMatrix, TimeSpan.FromSeconds(0.3));
40 matrixAnimation.Completed += (s, ex) => { UnlockProperty(toMatrix); };
41
42 Storyboard.SetTarget(matrixAnimation, this);
43 Storyboard.SetTargetProperty(matrixAnimation, new PropertyPath("(UIElement.RenderTransform).(MatrixTransform.Matrix)"));
44
45 storyboard.Children.Add(matrixAnimation);
46 storyboard.Begin();
47
48 #endregion
49
50
51
52 }
五、【拖拉展开-到达边缘时】进行一个动画 反弹反方向展开动画,类似【四】 直接上效果图就不贴代码了。

本文暂时不展示提供Demo下载,提供一个思路供大家参考。
WPF(C#) 矩阵拖动、矩阵动画、边缘展开动画处理。的更多相关文章
- *C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)
最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行 ...
- [转载]WPF控件拖动
这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...
- MATLAB特殊矩阵以及矩阵转置
特殊矩阵 通用特殊矩阵 zeros函数:产生全0矩阵,即零矩阵. ones函数:产生....1矩阵,即幺矩阵. eye函数:产生对角线为1的矩阵,当矩阵是方正时,得到单位矩阵. rand函数:产生(0 ...
- WPF3D立方体图形展开动画思路
WPF3D立方体图形展开动画 效果图: 规定: 立方体中心为(000),棱长为2,则(111)(-1-1-1)等1,-1三维组合的八个点为其顶点 坐标系: 补充: WPF 3D 分为中心对称旋转(Ro ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- 《Programming WPF》翻译 第8章 4.关键帧动画
原文:<Programming WPF>翻译 第8章 4.关键帧动画 到目前为止,我们只看到简单的点到点的动画.我们使用了To和From属性或者By属性来设计动画--相对于当前的属性值.这 ...
- 《Programming WPF》翻译 第8章 5.创建动画过程
原文:<Programming WPF>翻译 第8章 5.创建动画过程 所有在这章使用xaml举例说明的技术,都可以在代码中使用,正如你希望的.可是,代码可以使用动画在某种程度上不可能在x ...
- WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体
原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体 运行结果: 事实上很简单,定义好一个正方体,处理好纹理.关于MeshGeometry3D的正确定义和纹理这里就不多讲 ...
- C++题解:Matrix Power Series ——矩阵套矩阵的矩阵加速
Matrix Power Series r时间限制: 1 Sec 内存限制: 512 MB 题目描述 给定矩阵A,求矩阵S=A^1+A^2+--+A^k,输出矩阵,S矩阵中每个元都要模m. 数据范围: ...
随机推荐
- 老司机和你深聊 Kubenertes 资源分配之 Request 和 Limit 解析
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云容器服务团队 Kubernetes是一个容器集群管理平台,Kubernetes需要统计整体平台的资源使用情况,合理地将资源分配 ...
- 【Ubuntu 16】源码包安装Apache Httpd
源码包安装适合初学者使用. 背景信息 APR (Apache Portable Runtime) Apache可移植运行的任务(APR)项目是创建和维护软件库,为底层平台的具体实现提供了一个可预见的和 ...
- Vim 命令图解-Gvim使用笔记-2017-5-9
Vim 命令图解-Gvim使用笔记... 图片要是看的不太清楚推荐使用:鼠标右键在新标签中打开或是全屏看图 Vim中常用的一些速查命令: Vim发展历史:1976年Bill Joy开发了vi1988 ...
- 九天学会Java,第一天,变量和数据类型,赋值和输出
用9天入门三门编程语言,有可能嘛,尤其是对没有基础的同学来说?对于想学好的编程的人来说,无论从哪一门语言开始入手,语言的本身其实并不是我们最应该的关心的,至少不是作为一个初学者首先关心的. 网络上,网 ...
- 学问Chat UI(3)
前言 上文学问Chat UI(2)分析了消息适配器的实现; 本文主要学习下插件功能如何实现的.并以图片插件功能作为例子详细说明,分析从具体代码入手; 概要 分析策略说明 "+"功能 ...
- Django编写RESTful API(四):认证和权限
欢迎访问我的个人网站:www.comingnext.cn 前言: 按照前面几篇文章里那样做,使用Django编写RESTful API的基本功能已经像模像样了.我们可以通过不同的URL访问到不同的资源 ...
- hdu3720 Arranging Your Team
Arranging Your Team Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- Python使用MySQL数据库(新)
之前写过一篇 Python使用MySQL数据库的博客,主要使用的是Python2和MySQLdb驱动. python使用mysql数据库 然而,2016年开始,我从Python2切换到了Python3 ...
- JVM(一) OpenJDK1.8源码在Ubuntu16.04下的编译
笔者最近在学习周志明老师编写的<深入理解Java虚拟机>一书,书中第一章的实战部分就是"自己编译JDK",不过书中提到的是OpenJDK 7的编译.由于现在Java开发 ...
- 编写JsonResult封装JSON返回值(模板参阅)
编写JsonResult封装JSON返回值 package cn.tedu.note.util; import java.io.Serializable; import cn.tedu.note.se ...