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

我的开发环境是在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)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)的更多相关文章

  1. WPF(C#) 矩阵拖动、矩阵动画、边缘展开动画处理。

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

  2. WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果

    原文:WPF技术触屏上的应用系列(五): 图片列表异步加载.手指进行缩小.放大.拖动 .惯性滑入滑出等效果 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统, ...

  3. 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185

    Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...

  4. <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>

    //矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ...

  5. Codevs 1287 矩阵乘法&&Noi.cn 09:矩阵乘法(矩阵乘法练手题)

    1287 矩阵乘法  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 小明最近在为线性代数而头疼, ...

  6. wpf image控件循环显示图片 以达到动画效果 问题及解决方案

    1>最初方案: 用wpf的image控件循环显示图片,达到动画效果,其实就是在后台代码动态改变Image.Source的值,关键代码: ; i < ; i++)//六百张图片 { Bitm ...

  7. WM_SYSCOMMAND包括很多功能,比如:拖动左边框、拖动标题栏、滚动条滚动、点击最小化、双击标题栏——Delphi 通过事件代替了大部分常用的消息,所以Delphi 简单、易用、高效

    procedure TForm1.WMSysCommand(var Message: TWMSysCommand); var str: string; begin case Message.CmdTy ...

  8. WPF界面设计技巧(3)—实现不规则动画按钮

    原文:WPF界面设计技巧(3)-实现不规则动画按钮 发布了定义WPF按钮的教程后,有朋友问能否实现不规则形状的按钮,今天我们就来讲一下不规则按钮的制作. 不规则按钮的做法实际上和先前我们做不规则窗体的 ...

  9. Matlab中矩阵的平方和矩阵中每个元素的平方介绍

    该文章讲述了Matlab中矩阵的平方和矩阵中每个元素的平方介绍.   设t = [2 4 2 4] 则>> t.^2 ans = 4 164 16 而>> t^2 ans = ...

随机推荐

  1. Scrum敏捷开发沉思录

    计算机科学的诞生,是世人为了用数字手段解决实际生活中的问题.随着时代的发展,技术的进步,人们对于现实世界中的问题理解越来越深刻,描述也越来越抽象,于是对计算机软件的需求也越来越高,越来越复杂,变化也越 ...

  2. Redis系列(一):Redis的简介与安装

    原文链接(转载请注明出处):Redis系列(一):Redis的简介与安装 什么是 Redis Redis 是一个使用ANSI C 编写的开源.支持网络协议.基于内存.可选持久性的键值对数据库,它是一个 ...

  3. Cookie的HttpOnly、secure、domain属性

    Cookie主要属性 Cookie主要属性: path domain max-age expires:是expires的补充,现阶段有兼容性问题:IE低版本不支持,所以一般不单独使用 secure h ...

  4. 05-sudo权限配置

    阅读目录 基础环境准备 服务端配置 客户端配置 客户端验证 附:sudo常见属性介绍 常见错误分析 1. 基础环境准备 本文接文章openldap服务端安装配置 2. 服务端配置 导入sudo sch ...

  5. python第四十一天---作业:简单FTP

      作业要示: 开发简单的FTP:1. 用户登陆2. 上传/下载文件3. 不同用户家目录不同4. 查看当前目录下文件5. 充分使用面向对象知识 REDMAE 用户登陆 1.查看用户目录文件 2.上传文 ...

  6. python第三十七天--异常--socket

    异常处理 #!usr/bin/env python #-*-coding:utf-8-*- # Author calmyan list_l=['g','h'] data={'} try: #list_ ...

  7. windwos安装RabbitMQ

    目录 windows 安装RabbitMQ 安装erlang 安装rabbitmq 添加windows环境变量 检测rabbitmq状态 启动web管理插件 rabbitmq服务 windows 安装 ...

  8. Spring系列(1)--IOC 和 DI

    IOC 和 DI IOC 原理 xml 配置文件配置 bean dom4j 读取配置文件 工厂设计模式 反射机制创建对象 applicationContext.xml 配置文件,该配置文件名可自定义: ...

  9. 【PAT】B1082 射击比赛(20 分)

    水提水题,直接贴代码啦 #include<cstdio> #include<algorithm> using namespace std; struct ppp{ int id ...

  10. Sql Server 只有MDF文件恢复数据库的方法以及2008清除日志文件

    首先建立同名的空数据库,然后停止数据库服务运行,将MDF文件覆盖后启动服务,并修改和执行下面的语句. alter database JinMa_NYGL set EMERGENCY alter dat ...