我有一个加载的 WPF 应用程序Pages
在模板化的NavigationWindow
。我想在加载新页面时实现幻灯片过渡,并且由于可以调整窗口大小,因此据我所知,需要以编程方式确定转换的目标值。
我在中尝试了以下操作NavigationWindow
代码隐藏,但触发时没有任何效果。这PageContentContainerTransform
根据调试器的确定,也被正确定位。
public void DoTransition()
{
double targetX = this.ActualWidth;
this.TransitionStoryboard.Stop();
this.TransitionStoryboard.Children.Clear();
IEasingFunction easing = new QuadraticEase() { EasingMode = EasingMode.EaseOut };
DoubleAnimation translateXAnim = new DoubleAnimation() {
To = targetX,
Duration = TimeSpan.FromMilliseconds(250),
EasingFunction = easing,
};
DependencyObject d = this.Template.FindName("pageContentContainerTransform", this) as DependencyObject;
Storyboard.SetTarget(translateXAnim, d);
Storyboard.SetTargetProperty(translateXAnim, new PropertyPath(TranslateTransform.XProperty));
this.TransitionStoryboard.Children.Add(translateXAnim);
this.TransitionStoryboard.Begin();
}
The Template
is a ControlTemplate
包含以下 XAML 位,
...
<ContentPresenter
Grid.Row="1"
x:Name="pageContentContainer"
MaxHeight="{StaticResource ContentWindowMaxHeight}"
MaxWidth="{StaticResource ContentWindowMaxWidth}"
RenderTransformOrigin="0.5,0.5">
<ContentPresenter.RenderTransform>
<TranslateTransform x:Name="pageContentContainerTransform" X="0" Y="0" />
</ContentPresenter.RenderTransform>
</ContentPresenter>
...
为什么没有效果呢?
Update
如果您直接对元素进行动画处理而不将其包装在 a 中,则动画会起作用Storyboard
目的。例如。
public void DoTransition()
{
double targetX = this.ActualWidth;
this.TransitionStoryboard.Stop();
this.TransitionStoryboard.Children.Clear();
IEasingFunction easing = new QuadraticEase() { EasingMode = EasingMode.EaseOut };
DoubleAnimation translateXAnim = new DoubleAnimation() {
To = targetX,
Duration = TimeSpan.FromMilliseconds(250),
EasingFunction = easing,
};
TranslateTransform t = this.Template.FindName("pageContentContainerTransform", this) as TranslateTransform;
t.BeginAnimation(TranslateTransform.XProperty, translateXAnim);
}
但是,您可能会错过 Storyboard 对象提供的一些不错的动画控制元素,例如管理动画(停止、开始等)。似乎有可能的论点.Begin()
在与模板中使用相关的故事板对象上,但是使用.Begin(this, this.Template)
也没有做任何事情。