在 WPF 中以编程方式对用户控件内的网格进行动画处理缩放转换

本文关键字:网格 动画 转换 缩放 处理 控件 WPF 编程 方式 用户 | 更新日期: 2023-09-27 18:36:02

我在将某些动画方法从 WinRT 移植到 WPF 时遇到问题。

我在 UserControl 中有一个网格,我基本上想在降低其不透明度的同时放大网格,然后在不透明度恢复正常时将其缩小。

这是用户控件的 XAML 的一部分:

<Grid x:Name="myGrid">
        <Grid.RenderTransform>
            <ScaleTransform x:Name="scaleTransform"/>
        </Grid.RenderTransform>
        <!--Stuff here-->
</Grid>

我在 UserControl 的.cs文件中使用以下两个属性在代码中获取这些对象:

public Grid MyGrid
{
    get
    {
        return myGrid;
    }
}
public ScaleTransform GridScaleTransform
{
    get
    {
        return scaleTransform;
    }
}

现在,我有一个静态类,其中包含用于管理动画的方法。

我需要创建一个具有不透明度和缩放动画的情节提要,然后将其返回,以便我可以向其 Closed 事件添加一些处理程序,然后启动它。

这是无法正常工作的静态方法:

private static Storyboard createGridAnimation(MyUserControl element, double fromScale, double toScale, bool animIn = false)
{
    Storyboard storyboard = new Storyboard();
    //Add the opacity animation only if the animation is the one that scales up the grid
    if (animIn)
    {
        DoubleAnimationUsingKeyFrames opacityAnim= new DoubleAnimationUsingKeyFrames();
        opacityAnim.Duration = new Duration(TimeSpan.FromMilliseconds(200));
        //Some keyframes here...
        Storyboard.SetTarget(opacityAnim, element.MyGrid);
        Storyboard.SetTargetProperty(opacityAnim, new PropertyPath(UIElement.OpacityProperty));
        storyboard.Children.Add(opacityAnim);
    }            
    //Scale X
    DoubleAnimation scaleXAnimation = new DoubleAnimation() { From = fromScale, To = 2.0, AutoReverse = false };
    scaleXAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(100));
    Storyboard.SetTarget(scaleXAnimation, element.GridScaleTransform);
    Storyboard.SetTargetProperty(scaleXAnimation, new PropertyPath(ScaleTransform.ScaleXProperty));
    //Scale Y
    DoubleAnimation scaleYAnimation = new DoubleAnimation() { From = fromScale, To = 2.0, AutoReverse = false };
    scaleXAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(100));
    Storyboard.SetTarget(scaleYAnimation, elemento.GridScaleTransform);
    Storyboard.SetTargetProperty(scaleYAnimation, new PropertyPath(ScaleTransform.ScaleYProperty));
    storyboard.Children.Add(scaleXAnimation);
    storyboard.Children.Add(scaleYAnimation);
    return storyboard;
}

问题是唯一有效的动画是不透明度动画,两个 scaleTransform 双动画根本无法启动。我读到我可以尝试使用 SetTargetName 属性,但由于我在静态方法中并且我只有对目标 UIElement 的引用,因此它不起作用(至少,我没有设法让它以这种方式工作)。

这段代码有什么问题?

谢谢!

塞吉奥

在 WPF 中以编程方式对用户控件内的网格进行动画处理缩放转换

尝试使用 Grid 作为目标元素:

Storyboard.SetTarget(scaleXAnimation, element.MyGrid);
Storyboard.SetTargetProperty(scaleXAnimation,
    new PropertyPath("RenderTransform.ScaleX"));
Storyboard.SetTarget(scaleYAnimation, element.MyGrid);
Storyboard.SetTargetProperty(scaleYAnimation,
    new PropertyPath("RenderTransform.ScaleY"));