2010年4月4日星期日

在Silverlight中为UIElement.Visibility添加动画

       Visibility可以控制UIElement的可见性,但其是一个枚举变量,msdn中说:“若要对作为枚举的值进行动画处理,必须使用 DiscreteObjectKeyFrame。”而关键帧动画没法做出平滑的过渡效果。
       可以利用Action来实现标题内容。
1、创建一个带opacity动画的Action。

using System.Windows;
using System.Windows.Interactivity;
using System.Windows.Media.Animation;
using System;

namespace SilverlightApp.Actions
{
public class ToggleVisibilityAction : TargetedTriggerAction<UIElement>
{
protected override void Invoke(object parameter)
{
DoubleAnimation da = new DoubleAnimation();
da.Duration = new System.Windows.Duration(TimeSpan.FromSeconds(0.3));
Storyboard sb = new Storyboard();
sb.Children.Add(da);
Storyboard.SetTarget(da, this.Target);
Storyboard.SetTargetProperty(da, new PropertyPath("Opacity"));

if (this.Target.Visibility==Visibility.Visible)
{
da.To = 0;
sb.Begin();
sb.Completed += (o, e) => { this.Target.Visibility = Visibility.Collapsed; };
}
else
{
this.Target.Visibility = Visibility.Visible;
da.To = 1;
sb.Begin();
}

}
}
}

2、xaml中用之,替代visibility属性的设置。UIElement1是需要切换可见性的空间的x:Name。

<Button x:Name="btn1" Content="点我有动画效果">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<actions:ToggleVisibilityAction TargetName="UIElement1" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>

       其中:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:actions="clr-namespace:SilverlightApp.Actions"

       ps:t60风扇罢工了:开机一声怒吼,停留在fan error。搜索了一下,据说是缺油了,等买的螺丝刀到了以后给它加加油,希望不用去找js修。这还不到3年,51nb上那么多用x31的,我以为thinkpad少说能用10年呢。。。

没有评论:

发表评论