c#动画对齐-可能的

本文关键字:动画 对齐 | 更新日期: 2023-09-27 18:08:15

是否可以为AttachedPropertys创建一个c#动画,如对齐?也许1秒之间的变化从水平对齐。向左设置为HorizontalAlignment。对,这可能吗?

c#动画对齐-可能的

你不能制作平滑的动画,因为它们是离散状态。没有任何中间值。可以创建一个"动画"来改变从左到右的对齐方式,但它不会滑动。你也可以做很多工作,测量所有的控制,手动创建一个动画,将一些东西从屏幕的一边移动到另一边,使用画布之类的东西。左或边距来定位控件。

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

虽然不可能在两个属性之间直接流畅地动画,如

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>

这是可能的,下面是一个例子:

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);
    }
}