【发布时间】:2012-03-03 05:24:50
【问题描述】:
我正在尝试了解 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”会表现出类似于我在单击故事标题时感兴趣的行为.
【问题讨论】:
-
不知道你是否认为它是糟糕的设计,但我总是会在情节提要或动画的Completed 事件上附加一个处理程序,以便在它完成后执行某些操作。
-
好电话,我确实想到了这个想法。我不是设计专家,但我的想法是,行为真的是为做这样的事情而设计的——我只是希望有一种方法可以做到这一点,而不需要页面的 .xaml.cs 对动画故事板有任何了解.但这可能是我最终要做的:-) 谢谢!
-
也许您可以创建自己的 NavigateToPageAction 行为版本。然后您可以使用 Completed 事件,并在行为中导航到指定页面。不过,我还没有尝试过。我猜在 xaml.cs 中使用 click 事件仍然会导致问题。
标签: wpf windows-phone-7 attachedbehaviors