*C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)
最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画。之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来:
我的开发环境是在VS2017下进行的,这个工具条主要功能是:一个工具条,可进行拖拉。可进行拖拉展开,可在拖动之后不足展开并反向继续展开剩下的部分;
一、【拖动】 拖动的核心代码是通过矩阵进行定位和拖动的,定位是以父容器为模板的。以下是核心代码(及效果图):
- /// <summary>
- /// 这里TitleBar代指最顶上的操作Bar
- /// 桌面模式下默认展开工具栏-动画
- /// </summary>
- private void DesktopToolWindowClick()
- {
- //添加行为
- var behaviors = System.Windows.Interactivity.Interaction.GetBehaviors(this);
- behaviors.Clear();
- behaviors = System.Windows.Interactivity.Interaction.GetBehaviors(this);
- behaviors.Clear();
- //添加拖拉事件
- this._OnMouse = new MoveInContainerBehavior(MoveInContainerBehavior.MoveModes.Free, new Rect(, , WindowsWidth, WindowsHeight));
- behaviors.Add(this._OnMouse);
- }
- /// <summary>
- /// 加载用户控件的时候订阅事件
- /// </summary>
- private void _OnRegisterUserControl()
- {
- //订阅鼠标按下控件的事件;
- _OnMouse.MouseLeftButtonDown += new MoveInContainerBehavior.MouseLeftButtonDownEventHandler(_OnMouseDownEvent);
- //订阅鼠标拖动控件的事件;
- _OnMouse.MouseMove += new MoveInContainerBehavior.MouseMoveEventHandler(_OnMouseMoveEvent);
- //订阅鼠标释放控件的事件;
- _OnMouse.MouseLeftButtonUp += new MoveInContainerBehavior.MouseLeftButtonUpEventHandler(_OnMouseReleseEvent);
- }
- /// <summary>
- /// 用该事件控制弹窗位置
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void _ToolBar_Opened(object sender, EventArgs e)
- {
- //计算出控件移动的距离
- var Windows_Lengh = _UserControl_XEnd + this.PopMenu.ActualWidth;
- if (this._UserControl.ActualWidth + Windows_Lengh >= WindowsWidth)
- {
- this._ToolBar.Placement = System.Windows.Controls.Primitives.PlacementMode.Left;
- this._ToolBar.HorizontalOffset = -;
- }
- else
- {
- this._ToolBar.Placement = System.Windows.Controls.Primitives.PlacementMode.Right;
- this._ToolBar.HorizontalOffset = ;
- }
- }
二、【拖拉改变样式】 通过样式库调用可以在动画开始的时候就更换主题样式通过backup更改样式而不是UI直接改变,以下是核心代码(及效果图):
- #region 更改样式为【展开时候的样式】
- this._GridMain.Margin = new Thickness(, -, , );
- this._GridRowsF.Height = new GridLength();
- this.TitleBar.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#4a94ff"));
- this.TitleBar.Opacity = ;
- this.TitleBar.Margin = new Thickness(-, -, -, );
- this.Circle_Bar.Stroke = Brushes.White;
- this.Circle_Bar.Margin = new Thickness(, -, , );
- this._UserControl.Style = this.FindResource("Style.UserControl.PresentationMode.Desktop.Expand.UserControlStyles") as Style;
- #endregion
三、【拖拉展开-边缘充足】 进行一个动画 那就是直接按照自定义的动画时间进行展开,以下是核心代码(及效果图)使用GridLengthAnimation动画类自行百度,下面是经过二次编译的类调用方法:
- #region 尝试展开工具条--向下展开
- GridLengthAnimation ExpandAnimate = new GridLengthAnimation();
- ExpandAnimate.From = new GridLength(, GridUnitType.Pixel);
- ExpandAnimate.To = new GridLength(_GridRowsSLength, GridUnitType.Pixel);
- ExpandAnimate.Duration = TimeSpan.FromSeconds(0.3);
- ExpandAnimate.AutoReverse = false;
- this._GridMain.RowDefinitions[].BeginAnimation(RowDefinition.HeightProperty, ExpandAnimate);
- #endregion
四、【拖拉展开-边缘不足】 进行两个动画 1-先展开到边缘动画 2-再反弹反方向展开动画,以下是核心代码(及效果图):
- #region 先往下展开,展开结束之后再启用往上增加动画
- GridLengthAnimation ExpandAnimate = new GridLengthAnimation();
- ExpandAnimate.From = new GridLength(, GridUnitType.Pixel);
- ExpandAnimate.To = new GridLength(WindowsHeight - ParentPoint.Y - , GridUnitType.Pixel);
- ExpandAnimate.Duration = TimeSpan.FromSeconds(0.15);
- ExpandAnimate.AutoReverse = false;
- ExpandAnimate.Completed += StartMatrixExpandAnimate_Completed;
- this._GridMain.RowDefinitions[].BeginAnimation(RowDefinition.HeightProperty, ExpandAnimate);
- #endregion
- /// <summary>
- /// 当展开动画结束之后开始执行反向动画
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void StartMatrixExpandAnimate_Completed(object sender, EventArgs e)
- {
- //删除动画
- this._GridMain.RowDefinitions[].BeginAnimation(RowDefinition.HeightProperty, null);
- #region 向上移动动画
- // 1-向上移动
- Storyboard storyboard = new Storyboard();
- storyboard.FillBehavior = FillBehavior.Stop;
- MatrixTransform matrixTransformOfOwner = this.RenderTransform as MatrixTransform;
- if (matrixTransformOfOwner == null)
- {
- matrixTransformOfOwner = new MatrixTransform(this.RenderTransform.Value);
- this.RenderTransform = matrixTransformOfOwner;
- }
- this._oldTransform = this.RenderTransform;
- Matrix matrixOfOwner = this.RenderTransform.Value;
- Matrix fromMatrix = matrixOfOwner;
- Matrix toMatrix = new Matrix();
- toMatrix.OffsetX = ParentPoint.X;
- toMatrix.OffsetY = WindowsHeight - _GridRowsSLength - ;
- MatrixAnimation matrixAnimation = new MatrixAnimation(fromMatrix, toMatrix, TimeSpan.FromSeconds(0.3));
- matrixAnimation.Completed += (s, ex) => { UnlockProperty(toMatrix); };
- Storyboard.SetTarget(matrixAnimation, this);
- Storyboard.SetTargetProperty(matrixAnimation, new PropertyPath("(UIElement.RenderTransform).(MatrixTransform.Matrix)"));
- storyboard.Children.Add(matrixAnimation);
- storyboard.Begin();
- #endregion
- }
五、【拖拉展开-到达边缘时】进行一个动画 反弹反方向展开动画,类似【四】 直接上效果图就不贴代码了。
本文暂时不展示提供Demo下载,提供一个思路供大家参考。
*C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)的更多相关文章
- WPF(C#) 矩阵拖动、矩阵动画、边缘展开动画处理。
最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行 ...
- WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果
原文:WPF技术触屏上的应用系列(五): 图片列表异步加载.手指进行缩小.放大.拖动 .惯性滑入滑出等效果 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统, ...
- 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185
Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...
- <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>
//矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ...
- Codevs 1287 矩阵乘法&&Noi.cn 09:矩阵乘法(矩阵乘法练手题)
1287 矩阵乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 小明最近在为线性代数而头疼, ...
- wpf image控件循环显示图片 以达到动画效果 问题及解决方案
1>最初方案: 用wpf的image控件循环显示图片,达到动画效果,其实就是在后台代码动态改变Image.Source的值,关键代码: ; i < ; i++)//六百张图片 { Bitm ...
- WM_SYSCOMMAND包括很多功能,比如:拖动左边框、拖动标题栏、滚动条滚动、点击最小化、双击标题栏——Delphi 通过事件代替了大部分常用的消息,所以Delphi 简单、易用、高效
procedure TForm1.WMSysCommand(var Message: TWMSysCommand); var str: string; begin case Message.CmdTy ...
- WPF界面设计技巧(3)—实现不规则动画按钮
原文:WPF界面设计技巧(3)-实现不规则动画按钮 发布了定义WPF按钮的教程后,有朋友问能否实现不规则形状的按钮,今天我们就来讲一下不规则按钮的制作. 不规则按钮的做法实际上和先前我们做不规则窗体的 ...
- Matlab中矩阵的平方和矩阵中每个元素的平方介绍
该文章讲述了Matlab中矩阵的平方和矩阵中每个元素的平方介绍. 设t = [2 4 2 4] 则>> t.^2 ans = 4 164 16 而>> t^2 ans = ...
随机推荐
- IDEA插件清单
zookeeper插件,方便查看zk节点信息 Maven Helper,方便解决jar包冲突 Free Mybatis plugin,自动映射mapper接口到对应查询statements gener ...
- python第四十八天--高级FTP
高级FTP服务器1. 用户加密认证2. 多用户同时登陆3. 每个用户有自己的家目录且只能访问自己的家目录4. 对用户进行磁盘配额.不同用户配额可不同5. 用户可以登陆server后,可切换目录6. 查 ...
- 合理配置SQLSERVER内存
合理配置SQLSERVER内存 原文地址:https://www.cnblogs.com/lyhabc/archive/2012/09/28/2707857.html SQLSERVER是个很喜欢内存 ...
- Windows 系统光盘刻录教程-光盘怎样刻录?刻录数据光盘用"轨道一次写入"还是"光盘一次写入"?
刻录光盘需要 DVD-RW 的光驱,并且光盘需要 DVD-R 的光盘用于刻录.刻录工具可以使用https://cn.ultraiso.net/ 来进行刻录.选择软件目录 中 工具 ,选择 刻录光盘映像 ...
- HDU ACM 1879 继续畅通工程
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 第五章 绘图基础(ALTWIND)
线上箭头表示画线的方向.WINDING模式和ALTERNATE模式都会填充三个封闭的L型区域,号码从1到3.两个更小的内部区域,号码为4和5,在ALTERNATE模式下不被填充.但是在WINDING模 ...
- Python基础知识:集合
1.集合(set)是一个存放在中括号内的无序,不重复的序列.例如:set = {'1','12','25'} 2.创建集合的两种方法: set = {1,2,3} 中括号直接创建 set = {[1, ...
- var a = {m:1}; var b = a; a.n = b ={n:1}; console.log(a);console.log(b);
var a = {m:1}; var b = a; a.n = b ={n:1}; console.log(a); console.log(b); 确定b为{n:1},所以a为 {m:1,n:{n:1 ...
- 使用 React-Sketchapp 管理你的设计资产
首发:https://www.yuque.com/jingwhale/blog/do37mc 最近在整理设计规范的过程中,尝试使用了 Airbnb 公司发布的 react-sketchapp 工具.从 ...
- IO_ObjectOutputStream(对象的序列化)
对象序列化就是将一些对象写入到硬盘中存储起来,以便下次复用 import java.io.FileInputStream; import java.io.FileOutputStream; impor ...