【问题标题】:WPF/WP7 Attached Behaviors - Execute BEFORE firing the associated object's eventWPF/WP7 附加行为 - 在触发关联对象的事件之前执行
【发布时间】:2012-03-03 05:24:50
【问题描述】:

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

我发现this SO thread 看似相关,但接受的答案真的是唯一的方法吗?

感谢您的帮助。

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

【问题讨论】:

  • 不知道你是否认为它是糟糕的设计,但我总是会在情节提要或动画的Completed 事件上附加一个处理程序,以便在它完成后执行某些操作。
  • 好电话,我确实想到了这个想法。我不是设计专家,但我的想法是,行为真的是为做这样的事情而设计的——我只是希望有一种方法可以做到这一点,而不需要页面的 .xaml.cs 对动画故事板有任何了解.但这可能是我最终要做的:-) 谢谢!
  • 也许您可以创建自己的 NavigateToPageAction 行为版本。然后您可以使用 Completed 事件,并在行为中导航到指定页面。不过,我还没有尝试过。我猜在 xaml.cs 中使用 click 事件仍然会导致问题。

标签: wpf windows-phone-7 attachedbehaviors


【解决方案1】:

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

我看到两个选项...

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

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

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

Blend Behaviours - can you bind to their properties?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    相关资源
    最近更新 更多