我想了解WPF/WP7 Silverlight中的附加行为,并且我想出了一个概念性障碍,我想知道是否有人可以称重。WPF/WP7附加行为 - 执行之前触发相关对象的事件
我试图创建的功能的一个示例如下:用户单击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”展现出一个类似于我感兴趣的行为,当你点击标题故事。
不知道,如果你认为这是可怕的设计,但我总是一个处理器连接到[完成] (http://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.timeline.completed.aspx)事件的故事板或动画完成后做些事情。 – Clemens 2012-02-10 18:50:51
好的电话,这个想法确实发生在我身上。我不是设计专家,但我的想法是,行为真的是设计来做这样的事情 - 我只是希望有一种方法可以做到这一点,而不需要页面的.xaml.cs知道关于动画故事板的任何信息。但是,这可能是我最终做的:-)谢谢! – Jammer 2012-02-10 18:52:55
也许您可以创建自己的[NavigateToPageAction]版本(http://msdn.microsoft.com/zh-cn/library/ff979325(v = expression.40).aspx)行为。然后,您可以使用Completed事件,并在行为中导航到指定的所有页面。不过,我还没有尝试过。我猜想在xaml.cs中使用click事件仍然会导致问题。 – 2012-02-10 20:55:26