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

我的开发环境是在VS2017下进行的,这个工具条主要功能是:一个工具条,可进行拖拉。可进行拖拉展开,可在拖动之后不足展开并反向继续展开剩下的部分;

一、【拖动】   拖动的核心代码是通过矩阵进行定位和拖动的,定位是以父容器为模板的。以下是核心代码(及效果图):

  1. 1 /// <summary>
  2. 2 /// 这里TitleBar代指最顶上的操作Bar
  3. 3 /// 桌面模式下默认展开工具栏-动画
  4. 4 /// </summary>
  5. 5 private void DesktopToolWindowClick()
  6. 6 {
  7. 7
  8. 8
  9. 9 //添加行为
  10. 10 var behaviors = System.Windows.Interactivity.Interaction.GetBehaviors(this);
  11. 11 behaviors.Clear();
  12. 12
  13. 13 behaviors = System.Windows.Interactivity.Interaction.GetBehaviors(this);
  14. 14 behaviors.Clear();
  15. 15
  16. 16
  17. 17 //添加拖拉事件
  18. 18 this._OnMouse = new MoveInContainerBehavior(MoveInContainerBehavior.MoveModes.Free, new Rect(0, 0, WindowsWidth, WindowsHeight));
  19. 19 behaviors.Add(this._OnMouse);
  20. 20 }
  21. 21
  22. 22 /// <summary>
  23. 23 /// 加载用户控件的时候订阅事件
  24. 24 /// </summary>
  25. 25 private void _OnRegisterUserControl()
  26. 26 {
  27. 27
  28. 28 //订阅鼠标按下控件的事件;
  29. 29 _OnMouse.MouseLeftButtonDown += new MoveInContainerBehavior.MouseLeftButtonDownEventHandler(_OnMouseDownEvent);
  30. 30 //订阅鼠标拖动控件的事件;
  31. 31 _OnMouse.MouseMove += new MoveInContainerBehavior.MouseMoveEventHandler(_OnMouseMoveEvent);
  32. 32 //订阅鼠标释放控件的事件;
  33. 33 _OnMouse.MouseLeftButtonUp += new MoveInContainerBehavior.MouseLeftButtonUpEventHandler(_OnMouseReleseEvent);
  34. 34
  35. 35 }
  36. 36
  37. 37 /// <summary>
  38. 38 /// 用该事件控制弹窗位置
  39. 39 /// </summary>
  40. 40 /// <param name="sender"></param>
  41. 41 /// <param name="e"></param>
  42. 42 private void _ToolBar_Opened(object sender, EventArgs e)
  43. 43 {
  44. 44 //计算出控件移动的距离
  45. 45 var Windows_Lengh = _UserControl_XEnd + this.PopMenu.ActualWidth;
  46. 46 if (this._UserControl.ActualWidth + Windows_Lengh >= WindowsWidth)
  47. 47 {
  48. 48 this._ToolBar.Placement = System.Windows.Controls.Primitives.PlacementMode.Left;
  49. 49 this._ToolBar.HorizontalOffset = -5;
  50. 50 }
  51. 51 else
  52. 52 {
  53. 53 this._ToolBar.Placement = System.Windows.Controls.Primitives.PlacementMode.Right;
  54. 54 this._ToolBar.HorizontalOffset = 5;
  55. 55 }
  56. 56 }

二、【拖拉改变样式】 通过样式库调用可以在动画开始的时候就更换主题样式通过backup更改样式而不是UI直接改变,以下是核心代码(及效果图):

  1. 1 #region 更改样式为【展开时候的样式】
  2. 2 this._GridMain.Margin = new Thickness(0, -46, 0, 0);
  3. 3 this._GridRowsF.Height = new GridLength(47);
  4. 4 this.TitleBar.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4a94ff"));
  5. 5 this.TitleBar.Opacity = 1;
  6. 6 this.TitleBar.Margin = new Thickness(-7, -3, -7, 0);
  7. 7 this.Circle_Bar.Stroke = Brushes.White;
  8. 8 this.Circle_Bar.Margin = new Thickness(0, -3, 0, 0);
  9. 9 this._UserControl.Style = this.FindResource("Style.UserControl.PresentationMode.Desktop.Expand.UserControlStyles") as Style;
  10. 10 #endregion

三、【拖拉展开-边缘充足】 进行一个动画 那就是直接按照自定义的动画时间进行展开,以下是核心代码(及效果图)使用GridLengthAnimation动画类自行百度,下面是经过二次编译的类调用方法:

  1. 1 #region 尝试展开工具条--向下展开
  2. 2 GridLengthAnimation ExpandAnimate = new GridLengthAnimation();
  3. 3 ExpandAnimate.From = new GridLength(0, GridUnitType.Pixel);
  4. 4 ExpandAnimate.To = new GridLength(_GridRowsSLength, GridUnitType.Pixel);
  5. 5 ExpandAnimate.Duration = TimeSpan.FromSeconds(0.3);
  6. 6 ExpandAnimate.AutoReverse = false;
  7. 7 this._GridMain.RowDefinitions[1].BeginAnimation(RowDefinition.HeightProperty, ExpandAnimate);
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12 #endregion

四、【拖拉展开-边缘不足】 进行两个动画 1-先展开到边缘动画  2-再反弹反方向展开动画,以下是核心代码(及效果图):

  1. 1 #region 先往下展开,展开结束之后再启用往上增加动画
  2. 2 GridLengthAnimation ExpandAnimate = new GridLengthAnimation();
  3. 3 ExpandAnimate.From = new GridLength(0, GridUnitType.Pixel);
  4. 4 ExpandAnimate.To = new GridLength(WindowsHeight - ParentPoint.Y - 68, GridUnitType.Pixel);
  5. 5 ExpandAnimate.Duration = TimeSpan.FromSeconds(0.15);
  6. 6 ExpandAnimate.AutoReverse = false;
  7. 7 ExpandAnimate.Completed += StartMatrixExpandAnimate_Completed;
  8. 8 this._GridMain.RowDefinitions[1].BeginAnimation(RowDefinition.HeightProperty, ExpandAnimate);
  9. 9
  10. 10 #endregion
  11. 11
  12. 12 /// <summary>
  13. 13 /// 当展开动画结束之后开始执行反向动画
  14. 14 /// </summary>
  15. 15 /// <param name="sender"></param>
  16. 16 /// <param name="e"></param>
  17. 17 private void StartMatrixExpandAnimate_Completed(object sender, EventArgs e)
  18. 18 {
  19. 19 //删除动画
  20. 20 this._GridMain.RowDefinitions[1].BeginAnimation(RowDefinition.HeightProperty, null);
  21. 21
  22. 22 #region 向上移动动画
  23. 23 // 1-向上移动
  24. 24 Storyboard storyboard = new Storyboard();
  25. 25 storyboard.FillBehavior = FillBehavior.Stop;
  26. 26 MatrixTransform matrixTransformOfOwner = this.RenderTransform as MatrixTransform;
  27. 27 if (matrixTransformOfOwner == null)
  28. 28 {
  29. 29 matrixTransformOfOwner = new MatrixTransform(this.RenderTransform.Value);
  30. 30 this.RenderTransform = matrixTransformOfOwner;
  31. 31 }
  32. 32 this._oldTransform = this.RenderTransform;
  33. 33 Matrix matrixOfOwner = this.RenderTransform.Value;
  34. 34 Matrix fromMatrix = matrixOfOwner;
  35. 35 Matrix toMatrix = new Matrix();
  36. 36 toMatrix.OffsetX = ParentPoint.X;
  37. 37 toMatrix.OffsetY = WindowsHeight - _GridRowsSLength - 68;
  38. 38
  39. 39 MatrixAnimation matrixAnimation = new MatrixAnimation(fromMatrix, toMatrix, TimeSpan.FromSeconds(0.3));
  40. 40 matrixAnimation.Completed += (s, ex) => { UnlockProperty(toMatrix); };
  41. 41
  42. 42 Storyboard.SetTarget(matrixAnimation, this);
  43. 43 Storyboard.SetTargetProperty(matrixAnimation, new PropertyPath("(UIElement.RenderTransform).(MatrixTransform.Matrix)"));
  44. 44
  45. 45 storyboard.Children.Add(matrixAnimation);
  46. 46 storyboard.Begin();
  47. 47
  48. 48 #endregion
  49. 49
  50. 50
  51. 51
  52. 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. nmon 使用

    官网:http://nmon.sourceforge.net/pmwiki.php 步骤 1. 下载nmon到linux上: 2. 解压tar包,根据使用的linux版本选择使用的文件,并对其加上使用 ...

  2. 前后端分离(手)-- 使用mock.js(好样的)

    ## 前言: 本篇博文昨天七夕写的,一天下来被虐得体无完肤,苦逼的单身狗只能学习,对!我爱学习,关掉朋友圈,并写了一篇博文发泄发泄.这次写mock.js的使用,能使前后端分离,分离,分离,重要的是说三 ...

  3. sphinx随笔记了一下

    sphinx笔记 一:下载中文版coreseek包1:解压后,将etc下的mysql.conf文件复制一份放到上级目录下,改名为sphinx.conf2:配置文件: 2.1:source配置数据源so ...

  4. vue.js之获取当前点击对象(其实是套着vue的原生javascript吧,笑😊)

    转载请注明出处:http://www.cnblogs.com/meng1314-shuai/p/7455575.html 熟悉jquery的小伙伴应该都知道jquery获取当前点击对象是有多么的粗暴, ...

  5. (转载)理解Java中的引用传递和值传递

      关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...

  6. django下进行项目的部署

    -------------------Django下进行对应的服务器配置1.服务器购买 本人在阿里云购买了一个服务器,操作系统为windows server2008/Linux(ubuntu) 2.服 ...

  7. Day-7: 模块知识

    Python中,一个.py文件就是一个模块(module):而,包含了多个模块的一个目录,称为包. 每一个包中,都包含一个_init_.py文件,可以是一个空文件,这是Python将普通目录识别为包的 ...

  8. 创建WIFI热点--附近的百度帐号

    前提准备: 前提是当前的网卡必须支持AP(Acess Point)模式, 也可以使用外接的usb网卡 nodeJS环境 安装create_AP 使用create_AP创建热点, 安装方式为: git ...

  9. mha 复制检查报错“There is no alive server. We can't do failover”

    安装mha所参考的文章: http://linzhijian.blog.51cto.com/1047212/1906434 http://www.cnblogs.com/xiaoboluo768/p/ ...

  10. JAVA基础-集合(一)

    一.结构 Collection接口为一些单列集合的根接口,其常用子接口为List接口.Set接口.List接口常用实现子类为ArrayList(数组)LinkedList(链表).Set接口常用实现子 ...