如何设置WPF WebBrowser的动画

如何设置WPF WebBrowser的动画,wpf,.net-3.5,browser,storyboard,Wpf,.net 3.5,Browser,Storyboard,把它记录成一个问题,一个答案,这样别人就不必遭受同样的痛苦 我有一个WPF应用程序,可以为页面设置动画,就像在iPhone上滑动一样。在其中一个页面需要包含WebBrowser之前,一切都很好。它对动画的反应一点也不好——当它应该滑入时,它在你聚焦它之前不会出现,当它应该滑出时,它会消失,直到你将鼠标移到它上面。在这两种情况下,它只是弹出/弹出,而不是设置动画 使事情复杂化的是,在项目期间,由于不相关的原因,决定回到.NET3.5而不是4 所以问题是:我怎样才能(a)让WebBrowser正确地

把它记录成一个问题,一个答案,这样别人就不必遭受同样的痛苦

我有一个WPF应用程序,可以为页面设置动画,就像在iPhone上滑动一样。在其中一个页面需要包含WebBrowser之前,一切都很好。它对动画的反应一点也不好——当它应该滑入时,它在你聚焦它之前不会出现,当它应该滑出时,它会消失,直到你将鼠标移到它上面。在这两种情况下,它只是弹出/弹出,而不是设置动画

使事情复杂化的是,在项目期间,由于不相关的原因,决定回到.NET3.5而不是4

所以问题是:我怎样才能(a)让WebBrowser正确地设置动画;或者(b)如何在动画开始时隐藏WebBrowser,并在动画结束时再次显示它。动画目前是在XAML中定义的,我并不特别想将其更改为代码

接下来的一个问题是:还有没有更好的方法,仍然使用.net 3.5?

更新与WinForms one相比,WPF WebBrowser实在是太差劲了,我已经换成了WindowsFormsHost。下面的所有内容仍然适用,但WebBrowser现在并没有这么受欢迎(例如,它有一个DocumentCompleted事件)


我很快就放弃了制作WebBrowser动画的选项,因为它太难了,于是决定隐藏并重新显示它。动画的开始由视图模型上的命令触发。然后,它会找到应该显示的页面,创建该页面,并通过反映转换状态的附加属性启动动画

我创建了一个接口,
IRequireTransitionInfo
,这样调用
IRequireTransitionInfo.TransitionFrom
可以让它隐藏自己,
IRequireTransitionInfo.TransitionTo
再次显示。TransitionFrom很容易,但必须在故事板完成时调用TransitionTo

最初,在视图模型的构造函数中,它寻找故事板并连接到其完成的事件中,如下代码所示:

    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);
}
这似乎与.NET4配合得很好。降级到.net 3.5后,当上面连接已完成事件的代码运行时,我得到以下错误:

Specified value of type 'System.Windows.Media.Animation.Storyboard' must have IsFrozen set to false to modify.
尽管有其他一些答案,但您无法解冻冻结的Freezable,将代码移动到主窗口的构造函数中也没有帮助

我沿着故事板上绑定到视图模型上的命令的附加属性的路径前进

<Storyboard x:Key="SlideAnimation" local:EventCommand.StoryboardCompleted="{Binding Source={StaticResource Locator}, Path=Current.MainViewModel.StoryboardCompletedCommand}">
看起来你不能在故事板上做任何数据绑定(至少在.NET3.5下)。因此,我在某种程度上不公平地解决了这个问题,因为附加属性只定义了一个资源的字符串名称,该资源应该实现一个支持脚本完成通知的接口

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

如果有人知道在.NET3.5下处理这种情况的更好方法,我很乐意听到

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