C# WPF动画位置取决于窗口大小
我想创建一个动画(如果可能的话,可以使用xaml),其中一个矩形对象从页面外部(在其右侧)滑动并紧贴在页面中 动画应该可以在任何大小的窗口上运行,因此我创建了如下动画:C# WPF动画位置取决于窗口大小,c#,wpf,animation,C#,Wpf,Animation,我想创建一个动画(如果可能的话,可以使用xaml),其中一个矩形对象从页面外部(在其右侧)滑动并紧贴在页面中 动画应该可以在任何大小的窗口上运行,因此我创建了如下动画: <Storyboard x:Key="SlidingIntro"> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(Tr
<Storyboard x:Key="SlidingIntro">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="icon">
<EasingDoubleKeyFrame KeyTime="0" Value="{Binding ActualWidth, ElementName=AnimationCanvas}"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Page.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource SlidingIntro}"/>
</EventTrigger>
</Page.Triggers>
<Canvas x:Name="AnimationCanvas">
<Rectangle Width="{Binding ActualWidth, ElementName=AnimationCanvas}"
Height="{Binding ActualHeight, ElementName=AnimationCanvas}"
Canvas.Top="{Binding ActualHeight, ElementName=AnimationCanvas, Converter={StaticResource Math}, ConverterParameter=-x/2}"
RenderTransformOrigin="0.5,0.5" >
<Rectangle.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform X="{Binding ActualWidth, ElementName=AnimationCanvas}"/>
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
<Grid>
<Rectangle Fill="Gray">
<Rectangle.Style>
<Style TargetType="Rectangle">
<Style.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation To="0" Duration="0:0:1"
Storyboard.TargetProperty="RenderTransform.X"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding ActualWidth,
RelativeSource={RelativeSource AncestorType=Rectangle}}"/>
</Rectangle.RenderTransform>
</Rectangle>
</Grid>
矩形初始化如下:
<Storyboard x:Key="SlidingIntro">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="icon">
<EasingDoubleKeyFrame KeyTime="0" Value="{Binding ActualWidth, ElementName=AnimationCanvas}"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Page.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource SlidingIntro}"/>
</EventTrigger>
</Page.Triggers>
<Canvas x:Name="AnimationCanvas">
<Rectangle Width="{Binding ActualWidth, ElementName=AnimationCanvas}"
Height="{Binding ActualHeight, ElementName=AnimationCanvas}"
Canvas.Top="{Binding ActualHeight, ElementName=AnimationCanvas, Converter={StaticResource Math}, ConverterParameter=-x/2}"
RenderTransformOrigin="0.5,0.5" >
<Rectangle.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform X="{Binding ActualWidth, ElementName=AnimationCanvas}"/>
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
<Grid>
<Rectangle Fill="Gray">
<Rectangle.Style>
<Style TargetType="Rectangle">
<Style.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation To="0" Duration="0:0:1"
Storyboard.TargetProperty="RenderTransform.X"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding ActualWidth,
RelativeSource={RelativeSource AncestorType=Rectangle}}"/>
</Rectangle.RenderTransform>
</Rectangle>
</Grid>
问题是,矩形显示在其最终位置,而不设置动画。它就像第一帧的值是0,因为绑定失败。。。关于它被冻结的事情?试试这样的事情:
<Storyboard x:Key="SlidingIntro">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="icon">
<EasingDoubleKeyFrame KeyTime="0" Value="{Binding ActualWidth, ElementName=AnimationCanvas}"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Page.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource SlidingIntro}"/>
</EventTrigger>
</Page.Triggers>
<Canvas x:Name="AnimationCanvas">
<Rectangle Width="{Binding ActualWidth, ElementName=AnimationCanvas}"
Height="{Binding ActualHeight, ElementName=AnimationCanvas}"
Canvas.Top="{Binding ActualHeight, ElementName=AnimationCanvas, Converter={StaticResource Math}, ConverterParameter=-x/2}"
RenderTransformOrigin="0.5,0.5" >
<Rectangle.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform X="{Binding ActualWidth, ElementName=AnimationCanvas}"/>
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
<Grid>
<Rectangle Fill="Gray">
<Rectangle.Style>
<Style TargetType="Rectangle">
<Style.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation To="0" Duration="0:0:1"
Storyboard.TargetProperty="RenderTransform.X"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding ActualWidth,
RelativeSource={RelativeSource AncestorType=Rectangle}}"/>
</Rectangle.RenderTransform>
</Rectangle>
</Grid>
尝试以下方法:
<Storyboard x:Key="SlidingIntro">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="icon">
<EasingDoubleKeyFrame KeyTime="0" Value="{Binding ActualWidth, ElementName=AnimationCanvas}"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Page.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource SlidingIntro}"/>
</EventTrigger>
</Page.Triggers>
<Canvas x:Name="AnimationCanvas">
<Rectangle Width="{Binding ActualWidth, ElementName=AnimationCanvas}"
Height="{Binding ActualHeight, ElementName=AnimationCanvas}"
Canvas.Top="{Binding ActualHeight, ElementName=AnimationCanvas, Converter={StaticResource Math}, ConverterParameter=-x/2}"
RenderTransformOrigin="0.5,0.5" >
<Rectangle.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform X="{Binding ActualWidth, ElementName=AnimationCanvas}"/>
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
<Grid>
<Rectangle Fill="Gray">
<Rectangle.Style>
<Style TargetType="Rectangle">
<Style.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation To="0" Duration="0:0:1"
Storyboard.TargetProperty="RenderTransform.X"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding ActualWidth,
RelativeSource={RelativeSource AncestorType=Rectangle}}"/>
</Rectangle.RenderTransform>
</Rectangle>
</Grid>
在哪里应用动画?加载后动画立即开始。我知道动画本身可以工作,因为我可以手动将第一帧的值设置为窗口,所以问题一定与绑定有关。如果要在不同的矩形上重用此动画,我会选择混合行为,但这是在C代码中定义的,不是XAML。在哪里应用动画?加载后动画立即开始。我知道动画本身可以工作,因为我可以手动将第一帧的值设置为窗口,所以问题一定与绑定有关。如果要在不同的矩形上重用此动画,我会选择混合行为,但这是在C代码中定义的,不是XAML。我的问题的实际解决方案是使用双动画而不是关键帧。如果你在我的原始代码中改变了这一点,它也会起作用。我的问题的实际解决方案是使用双动画而不是关键帧。如果您在我的原始代码中更改了它,它也会起作用。