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這種情況下知道,我會很高興地聽到。