2

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

我发现这个看似相关的 SO 线程,但接受的答案真的是唯一的方法吗?

谢谢你的帮助。

编辑:如果你碰巧有一个 WP7 并且一心想弄清楚这一点,Reddit 阅读器应用程序“Baconit”会表现出类似于我在单击故事标题时感兴趣的行为。

4

1 回答 1

0

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

我看到两个选项...

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

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

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

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

于 2012-02-11T10:24:50.240 回答