WPF中自定义网格长度
需求
我们想在编辑一个列表中某一个条目时,将编辑的详情内容也放置当前面,比如右侧。
可以通过将一个网格,分成两个Cloumn,动态调整两个Cloumn的宽度,就可以实现这个需求。
我们知道,Clomun的宽度是个,而默认的动画没有这样子的。我们就需要自己实现这样一人动画。
设计我们从动画的类图上看到
我们可以从需求
我们想在编辑一个列表中某一个条目时,将编辑的详情内容也放置当前面,比如右侧。
可以通过将一个网格,分成两个Cloumn,动态调整两个Cloumn的宽度,就可以实现这个需求。
我们知道,Clomun的宽度是个网格长度,而默认的动画没有这样子的。我们就需要自己实现这样一人动画。
设计
我们从动画的类图上看到动画时间线继承,重写其GetCurrentValue
公共类GridLengthAnimation : AnimationTimeline {///summary////返回要动画化的对象类型////摘要公共覆盖类型targetpropertype=的类型(GridLength);///摘要///创建动画对象的实例////summary///returns返回网格长度的实例/返回受保护的覆盖系统窗户。freezable CreateInstanceCore(){ 0返回新的GridLengthAnimation();}///来自属性的总结////依赖性属性////摘要公共静态只读依赖属性从属性=依赖属性.注册(“从”,类型的(网格长度),类型of(GridLengthAnimation));///摘要////来自依赖项属性的CLR Wrapper////摘要公共GridLength From { get } return(GridLength)GetValue(GridLengthAnimation .from PrOperty);}设置{ SetValue(GridLengthAnimation .FromProperty,value);} }///到属性的总结////依赖性属性////摘要公共静态只读依赖属性到属性=依赖属性.注册(“到”,类型(网格长度),类型of(GridLengthAnimation));///摘要////到属性的CLR Wrapper////摘要公共网格长度To { get } return(GridLength)GetValue(GridLengthAnimation .到财产);}设置{ SetValue(GridLengthAnimation .ToProperty,value);} }///摘要////动画网格let set///summary///param name=' defaultoriginvalu '要动画化的原始值/param///param name=' DefaultDestinationValue '最终值/param///param name=' animationClock '动画时钟(计时器)/param///返回将新网格长度设置/返回公共覆盖对象GetCurrentValue(对象defaultoriginvalu,对象defaultDestinationValue,animationClock animationClock){ double froval=()from property().价值;double to val=((GridLength)GetValue(GridLengthAnimation .属性).价值;if (fromVal toVal)返回新的网格长度((1 -动画时钟.目前的进展。值)*(从值到值)到值,GridUnitType .星);否则返回新的网格长度目前的进展。值*(到val-FromVal)FromVal,GridUnitType .星);}如上所示,我们仿着默认动画实现了从,到,同时将其属性定义为网格长度,当动画执行时,我们重写了GetCurrentValue,使其根据从/到属性相关联。
优化
通过以上代码,我们实现了在网格长度变化时,实现动画。但是,试用后我们发现,动画,有点太线性。这个时候,怎么办?
可以通过引入激活功能来实现。我们知道激活功能其实就是一个与时间t有关的时间函数f(t ).通过时间函数的处理,我们使动画过渡不要那么线性。
///摘要///请参见cref='EasingFunction' /依赖项属性的名称。////汇总公共常量字符串easingfunctionpropertname=' EasingFunction ';///摘要///获取或设置请参见cref='EasingFunction'////属性的值。这是一个依赖属性////汇总公共IEasingFunction宽松函数{ get { return(IEasingFunction)GetValue(EasingFunctionProperty);} set { SetValue(EasingFunctionProperty,value);} } ///摘要///标识请参见cref='EasingFunction' /依赖项属性////摘要公共静态只读依赖属性EasingFunctionProperty=依赖属性.register(EasingFunctionPropertyName,typeof(IEasingFunction),typeof(GridLengthAnimation),new uipropertymadata(null));对应的,还要重写GetCurrentValue函数。
公共覆盖对象GetCurrentValue(对象defaultOriginValue,对象defaultDestinationValue,AnimationClock AnimationClock){ double from val=((GridLength)GetValue(from属性)).价值;double to val=((GridLength)GetValue(to property)).价值;//检查是否从调用方//if(FromVal==1)////设置从为实际值//FromVal=((GridLength)DefaultDestinationValue).价值;双倍进度=动画时钟。当前进度。值;IEasingFunction宽松函数=宽松函数;if (easingFunction!=null) { progress=easingFunction .轻松(进步);} if (fromVal toVal)返回新的GridLength((1-进度)*(从Val-到val)到VaL,GridUnitType .星);返回新的GridLength(进度* (toVal - fromVal) fromVal,GridUnitType .星);}使用
动画:网格动画故事板目标属性=“宽度”从=“0”到=“*”持续时间=“0:0:0.5”以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
版权声明:WPF中自定义网格长度是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。