首页 > 其他 > 详细

[答网友问]让GridLength支持动画

时间:2019-04-04 00:38:08      阅读:242      评论:0      收藏:0      [点我收藏+]
原文:[答网友问]让GridLength支持动画

                        [答网友问]WPF中让GridLength类型支持动画
                                                               周银辉

今天一位收到网友求助:
"你好!我想向你请教关于动画的问题:比如,一个Page分为上、下l两块,我想通过动画实现分别隐藏某块的内容,当我触发一个按钮的Click事件时,实现隐藏上面的面板,同时下的面板就要延伸并占据上面面板的空间,这个过程到好实现,问题是我如果第二次触发这个按钮的Click事件时,怎么才能让上面的面板出现(恢复原始大小)并且下面的面板的大小也回到原始大小"

对于这个问题,有一个很好的解决方法是,将两个面板放到Grid中,并让GridLength类型支持动画,就像Double类型有着对应的DoubleAnimation一样.这样就将网友的问题转化为:上面的面板所在行对应RowDefinition的高度由0.5变为0,再由0变为0.5(单位GridUnitType.Star)

以下是GridLengthAnimation类的完整代码,你可以使用她就像使用DoubleAnimaion一样.

技术分享图片using System;
技术分享图片
using System.Collections.Generic;
技术分享图片
using System.Text;
技术分享图片
using System.Windows.Media.Animation;
技术分享图片
using System.Windows;
技术分享图片
using System.Diagnostics;
技术分享图片
技术分享图片
namespace GridAnimationDemo
技术分享图片
{
技术分享图片    
internal class GridLengthAnimation : AnimationTimeline
技术分享图片    
{
技术分享图片        
技术分享图片        
public static readonly DependencyProperty FromProperty;
技术分享图片        
public static readonly DependencyProperty ToProperty;
技术分享图片       
技术分享图片
技术分享图片        
static GridLengthAnimation()
技术分享图片        
{
技术分享图片            FromProperty 
= DependencyProperty.Register("From"typeof(GridLength),
技术分享图片                
typeof(GridLengthAnimation));
技术分享图片
技术分享图片            ToProperty 
= DependencyProperty.Register("To"typeof(GridLength), 
技术分享图片                
typeof(GridLengthAnimation));
技术分享图片        }

技术分享图片
技术分享图片       
技术分享图片        
public override Type TargetPropertyType
技术分享图片        
{
技术分享图片            
get 
技术分享图片            
{
技术分享图片                
return typeof(GridLength);
技术分享图片            }

技术分享图片        }

技术分享图片
技术分享图片        
protected override System.Windows.Freezable CreateInstanceCore()
技术分享图片        
{
技术分享图片            
return new GridLengthAnimation();
技术分享图片        }

技术分享图片
技术分享图片        
public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock)
技术分享图片        
{
技术分享图片            
double fromVal = ((GridLength)GetValue(GridLengthAnimation.FromProperty)).Value;
技术分享图片            
double toVal = ((GridLength)GetValue(GridLengthAnimation.ToProperty)).Value;
技术分享图片
技术分享图片            
if (fromVal > toVal)
技术分享图片            
{
技术分享图片                
return new GridLength((1 - animationClock.CurrentProgress.Value) * (fromVal - toVal) + toVal, GridUnitType.Star);
技术分享图片            }

技术分享图片            
else
技术分享图片                
return new GridLength(animationClock.CurrentProgress.Value * (toVal - fromVal) + fromVal, GridUnitType.Star);
技术分享图片        }

技术分享图片      
技术分享图片
技术分享图片        
技术分享图片        
public GridLength From
技术分享图片        
{
技术分享图片            
get
技术分享图片            
{
技术分享图片                
return (GridLength)GetValue(GridLengthAnimation.FromProperty);
技术分享图片            }

技术分享图片            
set
技术分享图片            
{
技术分享图片                SetValue(GridLengthAnimation.FromProperty, value);
技术分享图片            }

技术分享图片        }

技术分享图片
技术分享图片        
public GridLength To
技术分享图片        
{
技术分享图片            
get
技术分享图片            
{
技术分享图片                
return (GridLength)GetValue(GridLengthAnimation.ToProperty);
技术分享图片            }

技术分享图片            
set
技术分享图片            
{
技术分享图片                SetValue(GridLengthAnimation.ToProperty, value);
技术分享图片            }

技术分享图片        }

技术分享图片      
技术分享图片
技术分享图片    }

技术分享图片}

技术分享图片


下载Demo


 

[答网友问]让GridLength支持动画

原文:https://www.cnblogs.com/lonelyxmas/p/10652543.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!