如何使用WPF中的Frame控件进行过渡效果?

我觉得这很容易,但我猜不是。

我有两页加载到我的帧控件中。 我希望能够从一个页面到下一个页面具有漂亮的幻灯片效果,或者只是一个简单的淡入效果。

似乎无法在互联网上的任何地方找到它。

更新1接受的答案很好,但我在这里找到了更好的答案。 http://www.japf.fr/2008/07/8/comment-page-1/

更新2如果您相信它我找到了更好的解决方案。
http://fluidkit.codeplex.com/

此处讨论了类似的问题: 导航到页面时的过渡淡化动画使用此处描述的技术,您可以在每次导航新页面时滑动\移动帧控件。 Smth是这样的:

XAML:

...  ... 

码:

 ... private bool _allowDirectNavigation = false; private NavigatingCancelEventArgs _navArgs = null; private Duration _duration = new Duration(TimeSpan.FromSeconds(1)); private double _oldHeight = 0; private void frame_Navigating(object sender, NavigatingCancelEventArgs e) { if (Content!=null && !_allowDirectNavigation) { e.Cancel = true; _navArgs = e; _oldHeight = frame.ActualHeight; DoubleAnimation animation0 = new DoubleAnimation(); animation0.From = frame.ActualHeight; animation0.To = 0; animation0.Duration = _duration; animation0.Completed += SlideCompleted; frame.BeginAnimation(HeightProperty, animation0); } _allowDirectNavigation = false; } private void SlideCompleted(object sender, EventArgs e) { _allowDirectNavigation = true; switch (_navArgs.NavigationMode) { case NavigationMode.New: if (_navArgs.Uri == null) frame.Navigate(_navArgs.Content); else frame.Navigate(_navArgs.Uri); break; case NavigationMode.Back: frame.GoBack(); break; case NavigationMode.Forward: frame.GoForward(); break; case NavigationMode.Refresh: frame.Refresh(); break; } Dispatcher.BeginInvoke(DispatcherPriority.Loaded, (ThreadStart)delegate() { DoubleAnimation animation0 = new DoubleAnimation(); animation0.From = 0; animation0.To = _oldHeight; animation0.Duration = _duration; frame.BeginAnimation(HeightProperty, animation0); }); } ... 

希望这会有所帮助,问候

我的答案是serge_gebunko给出的答案的改进版本。
它为您提供滑动左右效果

XAML

 ...  ... 

C#

  private void MainFrame_OnNavigating(object sender, NavigatingCancelEventArgs e) { var ta = new ThicknessAnimation(); ta.Duration = TimeSpan.FromSeconds(0.3); ta.DecelerationRatio = 0.7; ta.To = new Thickness(0 , 0 , 0 , 0); if (e.NavigationMode == NavigationMode.New) { ta.From = new Thickness(500, 0, 0, 0); } else if (e.NavigationMode == NavigationMode.Back) { ta.From = new Thickness(0 , 0 , 500 , 0); } (e.Content as Page).BeginAnimation(MarginProperty , ta); } 

这可能不是最好的答案,但它可能对您有所帮助或至少给您一些想法。 在Silverlight中,我通过使用Silverlight Toolkit中的TransitioningContentControl在页面之间实现了这种类型的滑动过渡效果。 它是一个内容控件,它基本上允许您在可视状态下定义自定义故事板,以便在内容更改时在旧内容和新内容之间进行转换。 如果您不想花时间定义自定义故事板,它还包括一些默认(淡入淡出/向上/向下)过渡。

我意识到您正在使用WPF,并且转换内容控件在WPF或WPF工具包中不可用。 但是,将此控制移植到WPF或至少使一个类似的东西可能并不太难。 如果您有时间,看起来它可能是可行的,它是您可以在其他地方重复使用的控制类型。

源代码用于Silverlight版本,Jesse Liberty有一个很好的教程 ,可以在Silverlight中使用控件。