2012-02-10 37 views
2

我想了解WPF/WP7 Silverlight中的附加行为,并且我想出了一个概念性障碍,我想知道是否有人可以称重。WPF/WP7附加行为 - 执行之前触发相关对象的事件

我试图创建的功能的一个示例如下:用户单击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”展现出一个类似于我感兴趣的行为,当你点击标题故事。

+0

不知道,如果你认为这是可怕的设计,但我总是一个处理器连接到[完成] (http://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.timeline.completed.aspx)事件的故事板或动画完成后做些事情。 – Clemens 2012-02-10 18:50:51

+0

好的电话,这个想法确实发生在我身上。我不是设计专家,但我的想法是,行为真的是设计来做这样的事情 - 我只是希望有一种方法可以做到这一点,而不需要页面的.xaml.cs知道关于动画故事板的任何信息。但是,这可能是我最终做的:-)谢谢! – Jammer 2012-02-10 18:52:55

+0

也许您可以创建自己的[NavigateToPageAction]版本(http://msdn.microsoft.com/zh-cn/library/ff979325(v = expression.40).aspx)行为。然后,您可以使用Completed事件,并在行为中导航到指定的所有页面。不过,我还没有尝试过。我猜想在xaml.cs中使用click事件仍然会导致问题。 – 2012-02-10 20:55:26

回答

0

如果您正在创建附加行为,我假设您的目标是消除背后的代码?然而,你想添加一个点击处理程序到按钮,这将导致代码后面?这里似乎有冲突!

我看到两个选项...

如果你很高兴与后面的代码,忘了附加的行为!只需创建一个执行动画的实用程序类,然后在完成时调用委托。然后,您可以在任何想要应用此效果的地方使用此功能。

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

见这样的问题,显示可能与混合行为的属性如何绑定:

Blend Behaviours - can you bind to their properties?

相关问题