最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画。之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来:

我的开发环境是在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#) 矩阵拖动、矩阵动画、边缘展开动画处理。的更多相关文章

  1. *C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)

    最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行 ...

  2. [转载]WPF控件拖动

    这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...

  3. MATLAB特殊矩阵以及矩阵转置

    特殊矩阵 通用特殊矩阵 zeros函数:产生全0矩阵,即零矩阵. ones函数:产生....1矩阵,即幺矩阵. eye函数:产生对角线为1的矩阵,当矩阵是方正时,得到单位矩阵. rand函数:产生(0 ...

  4. WPF3D立方体图形展开动画思路

    WPF3D立方体图形展开动画 效果图: 规定: 立方体中心为(000),棱长为2,则(111)(-1-1-1)等1,-1三维组合的八个点为其顶点 坐标系: 补充: WPF 3D 分为中心对称旋转(Ro ...

  5. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  6. 《Programming WPF》翻译 第8章 4.关键帧动画

    原文:<Programming WPF>翻译 第8章 4.关键帧动画 到目前为止,我们只看到简单的点到点的动画.我们使用了To和From属性或者By属性来设计动画--相对于当前的属性值.这 ...

  7. 《Programming WPF》翻译 第8章 5.创建动画过程

    原文:<Programming WPF>翻译 第8章 5.创建动画过程 所有在这章使用xaml举例说明的技术,都可以在代码中使用,正如你希望的.可是,代码可以使用动画在某种程度上不可能在x ...

  8. WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体

    原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体 运行结果: 事实上很简单,定义好一个正方体,处理好纹理.关于MeshGeometry3D的正确定义和纹理这里就不多讲 ...

  9. C++题解:Matrix Power Series ——矩阵套矩阵的矩阵加速

    Matrix Power Series r时间限制: 1 Sec 内存限制: 512 MB 题目描述 给定矩阵A,求矩阵S=A^1+A^2+--+A^k,输出矩阵,S矩阵中每个元都要模m. 数据范围: ...

随机推荐

  1. Silverlight——施工计划日报表(一)

    前一段时间,客户需要一个施工计划报表,要求能够直观的看到各个计划的实施时间,而且能够修改.琢磨着,决定用Silverlight搞定好了.效果如下: 用户可以通过右键菜单的[完成]选项来标记完成,左键选 ...

  2. Python 函数装饰器和闭包

    装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象. p.p1 { margin: 0.0px ...

  3. [H5]range对象的setStart/setEnd方法

    1.setStart:表示某个节点的range对象的起点位置;2.setEnd:表示某个节点的range对象的结束位置; 示例如下:<body> <div id="div& ...

  4. tensorflow笔记(四)之MNIST手写识别系列一

    tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html ...

  5. Node.js之操作文件系统(一)

    Node.js之操作文件系统(一) 1. 同步方法与异步方法 在Node.js中,使用fs模块来实现所有有关文件及目录的创建.写入及删除操作.,在fs模块中,所有对文件及目录的操作都可以使用同步与异步 ...

  6. go web 第二天 学习笔记

    package main import ( "crypto/md5" "fmt" "html/template" "io" ...

  7. 一个还算简单的微信消息SDK(基于.Net Standard 2.0)

    虽然微信公众号出现了好久,不过在SDK这件事情上感觉并没有多少人把它当成一个有技术含量的事情来做,很多SDK做的事情就是一个代码的堆叠,当然也可能写的好的并没有开源出来.所以在某个翻遍Github而无 ...

  8. 程序员也有春天之HTTP/2.0配置

    哎呀,一不小心自己的博客也是HTTP/2.0了,前段时间对网站进行了https迁移并上了CDN,最终的结果是这酱紫的(重点小绿锁,安全标示以及HTTP/2.0请求). 科普 随着互联网的快速发展,HT ...

  9. Error Handling in ASP.NET Core

    Error Handling in ASP.NET Core 前言  在程序中,经常需要处理比如 404,500 ,502等错误,如果直接返回错误的调用堆栈的具体信息,显然大部分的用户看到是一脸懵逼的 ...

  10. css 弹性盒兼容性写法,直接复制粘贴

    看这个定义弹性布局盒子display:-webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; disp ...