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



我正试图了解WPF/WP7 Silverlight中的附加行为,但我遇到了一个概念障碍,我想知道是否有人可以参与进来。

我试图创建的功能示例如下:用户单击其Click处理程序触发导航的按钮(即NavigationContext.Navigate()),在实际进行导航之前,按钮上会出现一个动画,将其不透明度从1降低到0("淡出"效果)。

所以,按顺序:

  1. 用户单击按钮
  2. 按钮执行动画
  3. 导航发生

很简单,对吧?我创建了一个看起来像这样的附加行为:

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处理程序,这显然可以正常工作,但当我将其连接起来时,动画不会在导航发生之前完成。当然,我理解为什么会这样,但我想知道是否有一种方法可以实现这一点,同时展现出非糟糕设计的美妙特性。

我发现了这个看似相关的线索,但公认的答案真的是唯一的方法吗?

谢谢你的帮助。

编辑:如果你碰巧有一个WP7,并且一心想弄清楚这一点,那么Reddit阅读器应用程序"Baconit"的行为与你点击故事标题时我感兴趣的行为相似。

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

我看到两种选择。。。

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

如果您想消除后面的代码,您应该使用命令而不是单击处理程序。将ICommand属性添加到附加的行为中,该行为将在情节提要完成时执行。然后,您可以将其绑定到公开视图模型的命令。

因此,请参阅问题,该问题显示了如何结合混合行为属性:

混合行为-你能绑定到它们的属性吗?

最新更新