C# WPF动画位置取决于窗口大小

C# WPF动画位置取决于窗口大小,c#,wpf,animation,C#,Wpf,Animation,我想创建一个动画(如果可能的话,可以使用xaml),其中一个矩形对象从页面外部(在其右侧)滑动并紧贴在页面中 动画应该可以在任何大小的窗口上运行,因此我创建了如下动画: <Storyboard x:Key="SlidingIntro"> <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(Tr

我想创建一个动画(如果可能的话,可以使用xaml),其中一个矩形对象从页面外部(在其右侧)滑动并紧贴在页面中

动画应该可以在任何大小的窗口上运行,因此我创建了如下动画:

<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。我的问题的实际解决方案是使用双动画而不是关键帧。如果你在我的原始代码中改变了这一点,它也会起作用。我的问题的实际解决方案是使用双动画而不是关键帧。如果您在我的原始代码中更改了它,它也会起作用。