如何设置WPF WebBrowser的动画
把它记录成一个问题,一个答案,这样别人就不必遭受同样的痛苦 我有一个WPF应用程序,可以为页面设置动画,就像在iPhone上滑动一样。在其中一个页面需要包含WebBrowser之前,一切都很好。它对动画的反应一点也不好——当它应该滑入时,它在你聚焦它之前不会出现,当它应该滑出时,它会消失,直到你将鼠标移到它上面。在这两种情况下,它只是弹出/弹出,而不是设置动画 使事情复杂化的是,在项目期间,由于不相关的原因,决定回到.NET3.5而不是4 所以问题是:我怎样才能(a)让WebBrowser正确地设置动画;或者(b)如何在动画开始时隐藏WebBrowser,并在动画结束时再次显示它。动画目前是在XAML中定义的,我并不特别想将其更改为代码 接下来的一个问题是:还有没有更好的方法,仍然使用.net 3.5?更新与WinForms one相比,WPF WebBrowser实在是太差劲了,我已经换成了WindowsFormsHost。下面的所有内容仍然适用,但WebBrowser现在并没有这么受欢迎(例如,它有一个DocumentCompleted事件)如何设置WPF WebBrowser的动画,wpf,.net-3.5,browser,storyboard,Wpf,.net 3.5,Browser,Storyboard,把它记录成一个问题,一个答案,这样别人就不必遭受同样的痛苦 我有一个WPF应用程序,可以为页面设置动画,就像在iPhone上滑动一样。在其中一个页面需要包含WebBrowser之前,一切都很好。它对动画的反应一点也不好——当它应该滑入时,它在你聚焦它之前不会出现,当它应该滑出时,它会消失,直到你将鼠标移到它上面。在这两种情况下,它只是弹出/弹出,而不是设置动画 使事情复杂化的是,在项目期间,由于不相关的原因,决定回到.NET3.5而不是4 所以问题是:我怎样才能(a)让WebBrowser正确地
我很快就放弃了制作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">