WPF / WP7附加行为 - 在触发关联对象的事件之前执行

时间:2012-02-10 18:35:09

标签: wpf windows-phone-7 attachedbehaviors

我正在尝试了解WPF / WP7 Silverlight中的附加行为,并且我遇到了一个概念上的障碍,我想知道是否有人可以权衡。

我正在尝试创建的功能的示例如下:用户单击其Click处理程序触发导航的按钮(即NavigationContext.Navigate()),并且在导航实际发生之前,动画发生在将其不透明度从1降低到0的按钮(“淡出”效果)。

所以,按顺序:

  1. 用户点击按钮
  2. 按钮执行动画
  3. 导航发生
  4. 够简单吧?我创建了一个看起来像这样的附加行为:

    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”表现出的行为类似于我点击故事标题时我感兴趣的行为

1 个答案:

答案 0 :(得分:0)

如果您正在创建附加行为,我假设您的目标是消除背后的代码?但是,您想要在按钮上添加一个单击处理程序,这会导致代码落后吗?这里似乎有冲突!

我看到两个选项......

如果您对代码感到满意,请忘记附加行为!只需创建一个执行动画的实用程序类,然后在完成时调用委托。然后,您可以在任何想要应用此效果的地方使用它。

如果你想要消除代码,你应该使用命令而不是点击处理程序。将ICommand属性添加到您的故事板完成时执行的附加行为。然后,您可以将此绑定到公开视图模型的命令。

请参阅这样的问题,该问题显示了如何使用混合行为属性进行绑定:

Blend Behaviours - can you bind to their properties?