我想了解WPF/WP7 Silverlight中的附加行爲,並且我想出了一個概念性障礙,我想知道是否有人可以稱重。WPF/WP7附加行爲 - 執行之前觸發相關對象的事件
我試圖創建的功能的一個示例如下:用戶單擊Click處理程序觸發導航的按鈕(即NavigationContext.Navigate()),並且在導航實際發生之前發生動畫在將其不透明度從1降低到0的按鈕上(「淡出」效果)。
因此,爲了:
- 用戶點擊該按鈕
- 按鈕執行
- 導航發生
夠簡單吧動畫?我創建了一個附加的行爲,看起來像這樣:
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」展現出一個類似於我感興趣的行爲,當你點擊標題故事。
不知道,如果你認爲這是可怕的設計,但我總是一個處理器連接到[完成] (http://msdn.microsoft.com/zh-cn/library/system.windows.media.animation.timeline.completed.aspx)事件的故事板或動畫完成後做些事情。 – Clemens 2012-02-10 18:50:51
好的電話,這個想法確實發生在我身上。我不是設計專家,但我的想法是,行爲真的是設計來做這樣的事情 - 我只是希望有一種方法可以做到這一點,而不需要頁面的.xaml.cs知道關於動畫故事板的任何信息。但是,這可能是我最終做的:-)謝謝! – Jammer 2012-02-10 18:52:55
也許您可以創建自己的[NavigateToPageAction]版本(http://msdn.microsoft.com/zh-cn/library/ff979325(v = expression.40).aspx)行爲。然後,您可以使用Completed事件,並在行爲中導航到指定的所有頁面。不過,我還沒有嘗試過。我猜想在xaml.cs中使用click事件仍然會導致問題。 – 2012-02-10 20:55:26