2012-07-12 74 views
2

只需將其記錄爲問題即答案,以便其他人不必遭受同樣的痛苦。如何動畫化WPF WebBrowser

我有一個動畫頁面的WPF應用程序,就像在iPhone上刷卡一樣。一直都很好,直到其中一個頁面需要包含WebBrowser。它對動畫沒有什麼反應 - 當它應該滑入時,它不會出現,直到你將它聚焦,並且它應該滑出時,它會消失,直到你將鼠標移動到它上面。在這兩種情況下,它只是彈出/彈出而不是動畫。

複雜的事情,在項目過程中,由於無關的原因決定返回到.net 3.5而不是4。

所以問題是:我怎麼能(a)讓WebBrowser正確地動畫;或(b)如何在動畫開始時隱藏WebBrowser並在最後再次顯示。該動畫目前在XAML中定義,我不特別想將其更改爲代碼。

而後續問題是:還有更好的方法,仍然使用.net 3.5嗎?相比的WinForms一個

回答

2

UPDATE的WPF web瀏覽器是如此可憐瘸子,我已經換了,使用WindowsFormsHost。下面的所有內容仍然適用,但WebBrowser現在並不那麼忙碌(例如它有一個DocumentCompleted事件)。


我很快放棄了動畫的web瀏覽器的選項,因爲它只是得到了所有太辛苦,而是決定隱藏和重新顯示它。動畫的開始由視圖模型上的命令觸發。然後,它找到應該顯示的頁面,創建它並通過反映轉換狀態的附加屬性啓動動畫。

我創建了一個界面,IRequireTransitionInfo,這樣一個IRequireTransitionInfo.TransitioningFrom的調用給了它一個隱藏自身的機會,並且IRequireTransitionInfo.TransitioningTo再次顯示。 TransitioningFrom很容易,但在故事板完成時不得不調用TransitioningTo。

最初,在視圖模型的構造,它去尋找故事板和勾搭成其完成的事件,如下面的代碼:

Storyboard animation = Application.Current.FindResource("SlideAnimation") as Storyboard; 
    if (animation != null) 
    { 
     animation.Completed += new EventHandler(animation_Completed); 
    } 

,並且隨後事件處理程序:

void animation_Completed(object sender, EventArgs e) 
{ 
    IRequireTransitionInfo info = currentViewModel as IRequireTransitionInfo; 
    if (info != null) 
    info.TransitioningTo(currentView); 
} 

這似乎與.NET 4中工作得很好降級到.NET 3.5,當上面的代碼掛鉤Completed事件跑後,我得到了以下錯誤:

Specified value of type 'System.Windows.Media.Animation.Storyboard' must have IsFrozen set to false to modify. 

儘管一些其他的答案,你不能解凍凍結Freezable,並將代碼移動到MainWindow的構造函數沒有幫助。

我沿着視圖模型上綁定到命令的故事板上附加屬性的路徑。

<Storyboard x:Key="SlideAnimation" local:EventCommand.StoryboardCompleted="{Binding Source={StaticResource Locator}, Path=Current.MainViewModel.StoryboardCompletedCommand}"> 

然而,這導致以下運行時錯誤:

Cannot convert the value in attribute 'ContentTemplate' to object of type 'System.Windows.DataTemplate'. Cannot freeze this Storyboard timeline tree for use across threads. 

看來你不能做一個故事板的任何數據綁定(下.NET 3.5至少)。因此,我通過讓附屬屬性定義一個資源的字符串名稱來預期實現一個支持故事板完成通知的接口,從而在某種程度上不恰當地解決了這個問題。

<Storyboard x:Key="SlideAnimation" local:EventCommand.StoryboardCompletedHandler="Locator"> 

如果有人有更好的方式來處理在.NET 3.5這種情況下知道,我會很高興地聽到。