c#动画阵营 - 可能吗?

时间:2011-09-12 14:30:10

标签: c# wpf animation alignment

是否可以为像Alignment这样的AttachedPropertys创建一个c#动画?也许在从Horizo​​ntalAlignment.Left到Horizo​​ntalAlignment.Right之间的1秒之间移动 - 是否可能?

非常感谢。

3 个答案:

答案 0 :(得分:1)

在制作平滑动画的意义上,您无法为其设置动画,因为它们是离散状态,因此从左到右滑动。没有任何中间值。可以创建一个“动画”,在某个点从左到右改变对齐,它不会滑过。您还可以执行大量工作并测量所有控件以手动创建动画,该动画使用Canvas.Left或margin等位置将控件从屏幕的一侧移动到另一侧以定位控件。

附加属性部分不是问题,只需在动画的目标属性部分中使用附加属性的全名。

答案 1 :(得分:0)

虽然无法在两个属性(如

)之间平滑地直接制作动画
HorizontalAlignment="Right" VerticalAlignment="Bottom"

HorizontalAlignment="Center" VerticalAlignment="Center"

我确实想方设法以一种我认为可能值得分享的方式为应用做这件事。我只是将控件放在占据窗口整个窗格的网格中。我将控件对齐到网格的右下角。然后我用网格动画来变换并缩小我需要的角落我想要对齐控件的位置(在这个例子中居中。请参阅下面的完整代码。

<Grid Margin="5,5,14,70" Visibility="{Binding Path=AdminModeIsEnabled, Converter={StaticResource CollapsedVisibilityConverter}, FallbackValue=Visible}">
    <Grid.Style>
        <Style TargetType="Grid">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <ScaleTransform/>
                </Setter.Value>
            </Setter>
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <ScaleTransform/>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding CenterPanel}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)" To="2" Duration="0:0:0.5" />
                                <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To=".5" Duration="0:0:0.5" />
                                <DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleX)" To="2" Duration="0:0:0.5" />
                                <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleX)" To=".5" Duration="0:0:0.5" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                    <DataTrigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.5" />
                                <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:0.5" />
                                <DoubleAnimation Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.5" />
                                <DoubleAnimation Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleX)" To="1" Duration="0:0:0.5" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.ExitActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Grid.Style>
    <Image Height="15" Source="\Images\Test.png" HorizontalAlignment="Right" VerticalAlignment="Bottom" />
</Grid>

答案 2 :(得分:0)

这是一个例子:

class StoryBoardManager : System.Windows.Media.Animation.Storyboard
{
    public void ChangeRectangleAlignment(DependencyObject target, VerticalAlignment verticalAlignment, HorizontalAlignment horizontalAlignment, int BeginTimeMillisecond)
    {
        ObjectAnimationUsingKeyFrames objectAnimation = new ObjectAnimationUsingKeyFrames()
        {
            BeginTime = TimeSpan.FromMilliseconds(0)
        };
        Storyboard.SetTarget(objectAnimation, target);
        Storyboard.SetTargetProperty(objectAnimation, new PropertyPath("(FrameworkElement.HorizontalAlignment)"));
        DiscreteObjectKeyFrame keyFrame = new DiscreteObjectKeyFrame(horizontalAlignment, TimeSpan.FromMilliseconds(BeginTimeMillisecond));
        objectAnimation.KeyFrames.Add(keyFrame);
        this.Children.Add(objectAnimation);
    }
}

有关详细信息,请参阅this other question