为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

1 解锁被Storyboard束缚的关联属性

2018-05-06 4页 doc 17KB 5阅读

用户头像

is_792768

暂无简介

举报
1 解锁被Storyboard束缚的关联属性1 解锁被Storyboard束缚的关联属性 WPF/Silverlight深度解决方案:(一)解锁被Storyboard束缚的关联属性 如果您在使用WPF/Silverlight进行相关动画开发中使用了Storyboard,并对关联属性进行了动画修改,那么您是否有注意到这些关联属性常常无法再通过直接赋值的形式去修改,尽管它的值已经被更改,但却始终无法在界面上得以体现。例如,在我的C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial)教程里大量运用了Storyboard对角色的X,Y坐标关联...
1 解锁被Storyboard束缚的关联属性
1 解锁被Storyboard束缚的关联属性 WPF/Silverlight深度解决方案:(一)解锁被Storyboard束缚的关联属性 如果您在使用WPF/Silverlight进行相关动画开发中使用了Storyboard,并对关联属性进行了动画修改,那么您是否有注意到这些关联属性常常无法再通过直接赋值的形式去修改,尽管它的值已经被更改,但却始终无法在界面上得以体现。例如,在我的C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial)教程里大量运用了Storyboard对角色的X,Y坐标关联属性以及角色Direction朝向关联属性进行动画形式修改;如果统一的每次更改均使用Storyboard是不会存在任何问题的,结果是所见即所得。但是如果大家在使用Storyboard更改了朝向Direction这个关联属性后,若想通过鼠标右键点击然后再更改角色朝向朝北:Direction = 0,结果却无任何效果;很多朋友怀疑:是不是鼠标右键事件哪个位置写错了,结果却并非如此。在WPF/Silverlight中使用Storyboard修改过关联属性后,这些关联属性将被锁定,外界是无法通过直接赋值的形式对其进行修改的。难道束手无策了,其实msdn很早就给我们提供了3个解决方案,原文地址: 下面是我对它们的解析及拓展: 方法一:将动画的属性设置为: FillBehavior Stop storyboard.FillBehavior = FillBehavior.Stop; 通过将设置为,即通知动画在到达其活动期末尾后停止FillBehaviorStop 影响其目标关联属性。虽然达到了目的,但必须等待动画结束时才会生效,且更关键的是之前被修改过的所有关联属性值此时都被还原成了初始storyboard 值。因此,此方法只适合用于制作类似网页中的导航菜单按钮:当鼠标悬停在菜单上时,菜单图形按钮执行一段华丽的变化动画;当鼠标移开后即变回为初始图片。 方法二:移除整个动画板。此方法必须通过类似(Storyboard) Leader.BeginStoryboard(storyboard, 或HandoffBehavior.SnapshotAndReplace, true); storyboard.Begin(Leader, HandoffBehavior.SnapshotAndReplace, true); 这两种方式启动动画,然后在需要解锁时通过 通知动画板动画storyboard.Remove(Leader); storyboard = null; 停止影响名为对象的目标关联属性并移除。需要特别注意Leader,storyboard的是?必须将动画的参数设置为;?IsControllabletrueHandoffBehavior 最好设置为,此枚举的作用是:新动画将替换它们所SnapshotAndReplace 应用到的关联属性上的任何现有动画。 方法三:从单个关联属性移除动画。同样的以精灵角色朝向为例,如果该属性已被锁定,那么如果此时需要对其值进行更改,我们可以通过类Storyboard 似: 或Leader.BeginAnimation(QXSpirit.DirectionProperty, null);Leader.ApplyAnimationClock(QXSpirit.DirectionProperty, null); 这两种方法来禁止关联到的动画继续影响的LeaderLeader 关联属性(此方法对于非动画板动画也同样有效)。接着后DirectionProperty 面我们就可以轻松的通过为精灵的朝向属性进行赋值Leader.Direction = 0 并在画面中得到体现。 中灵活的配合以上三种解决方案在 WPF 使用几乎可以应付任何关于storyboard.Children.Clear();Storyboard锁死关联属性的问题;但是在中却往往不尽如人意。毕竟只是SilverlightWPF的子集,在功能与方法上有着太少的支持。因此,我拓展了以下两种解决方案, 更重要的,它们均为通用的且药到病除的终极策略。WPF/Silverlight 方法四:可以通过每次运行新的动画时先暂停之前的动画(注意,是暂停()而不是停止()),例如然后再PauseStopstoryboard.Pause(Leader); 创建一个新的动画板这样,之前被storyboard = new Storyboard(); 修改过的关联属性目标值会被新的作为起点属性值,storyboardstoryboard从而完美实现关联属性在动画与动画之间的衔接。有些朋友会问那之前的 是否会继续占用内存空间,对于的内存回收机制我们无法控storyboard.net 知,根据我多方查阅的资料,若您不放心,不妨在创建新的前,通Storyboard过将之注销掉,在动画中我是这样做的,实storyboard = null Silverlight 践证明此方法确实达到的目的。 方法五:以毒攻毒。既然是锁死了我们需要更改的关联属性,Storyboard 那么我们同样可以通过动画的形式来赋值更改这些关联属性。此方Storyboard 法乃下下策,缺点是毫无性能而言;优点是万能性:适合一切被Storyboard锁死的关联属性的修改,且无论是在还是中。下面同样以精WPFSilverlight灵的朝向为例,我们可以通过: DoubleAnimation doubleAnimation = new DoubleAnimation(); doubleAnimation.To = direction; doubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(10)); Storyboard.SetTarget(doubleAnimation, spirit);Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("Direction")); storyboard.Children.Add(doubleAnimation); storyboard.Begin(); 这样的动画形式对关联属性进行强行更改。QXSpirit.DirectionProperty 本节:希望以上种解锁关联属性的解决方案能对大 5Storyboard 家的动画开发有所帮助;同时,如果哪些地方有写得不妥或WPF/Silverlight 有错漏的也请大家不吝赐教,我会及时进行修改及更正。 下一节我将为大家讲解如何保护源码,敬请关注。Silverlight
/
本文档为【1 解锁被Storyboard束缚的关联属性】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索