2012-02-10 38 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?

相關問題