我正在尝试了解WPF / WP7 Silverlight中的附加行为,并且我遇到了一个概念上的障碍,我想知道是否有人可以权衡。
我正在尝试创建的功能的示例如下:用户单击其Click处理程序触发导航的按钮(即NavigationContext.Navigate()),并且在导航实际发生之前,动画发生在将其不透明度从1降低到0的按钮(“淡出”效果)。
所以,按顺序:
够简单吧?我创建了一个看起来像这样的附加行为:
public class FadeBehavior : Behavior<Button>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Click += (obj, args) => {
Storyboard sb = new Storyboard();
DoubleAnimation an = new DoubleAnimation();
an.Duration = TimeSpan.FromMilliseconds(300);
an.From = 1;
an.To = 0;
Storyboard.SetTarget(an, AssociatedObject);
Storyboard.SetTargetProperty(an, new PropertyPath("Opacity"));
sb.Children.Add(an);
sb.Begin();
};
}
}
如果按钮所在页面的.xaml.cs不包含触发导航的Click处理程序,这显然可以正常工作,但是当我连接它时,动画在导航发生之前没有完成。当然,我理解为什么会这样,但我想知道是否有一种方法可以实现这一目标,同时也展示了非可怕设计的奇妙特性。
我发现this SO thread看似相关,但是接受的答案真的是唯一的方法吗?
感谢您的帮助。
编辑:如果你碰巧有一个WP7而且一心想要解决这个问题,Reddit读者应用程序“Baconit”表现出的行为类似于我点击故事标题时我感兴趣的行为
答案 0 :(得分:0)
如果您正在创建附加行为,我假设您的目标是消除背后的代码?但是,您想要在按钮上添加一个单击处理程序,这会导致代码落后吗?这里似乎有冲突!
我看到两个选项......
如果您对代码感到满意,请忘记附加行为!只需创建一个执行动画的实用程序类,然后在完成时调用委托。然后,您可以在任何想要应用此效果的地方使用它。
如果你想要消除代码,你应该使用命令而不是点击处理程序。将ICommand属性添加到您的故事板完成时执行的附加行为。然后,您可以将此绑定到公开视图模型的命令。
请参阅这样的问题,该问题显示了如何使用混合行为属性进行绑定: