0

我正在测试 Storyboard.SetTarget 方法。我需要为矩形的宽度和高度变化设置动画。我找到了 Microsoft 示例,但是当我在程序中包含代码时,解决方案无法构建和部署。

我收到这样的错误:

IDE0006 加载项目时遇到错误。某些项目功能,例如对失败项目和依赖它的项目的完整解决方案分析,已被禁用。

错误 CS0246:找不到类型或命名空间名称“Color”(您是否缺少 using 指令或程序集引用?)

当我添加命名空间时:

System.Windows.Media.Animation

我得到错误:

错误 CS0234:命名空间“System.Windows”中不存在类型或命名空间名称“Media”(您是否缺少程序集引用?)

我使用的示例不是用于 UWP 吗?

这是我使用的示例代码:

private void Create_And_Run_Animation(object sender, EventArgs e)
    {
        // Create a yellow rectangle that will be the target
        // of the animation.
        Rectangle myRectangle = new Rectangle();
        myRectangle.Width = 200;
        myRectangle.Height = 20;
        Color myColor = Color.FromArgb(255, 255, 0, 0);
        SolidColorBrush myBrush = new SolidColorBrush();
        myBrush.Color = myColor;
        myRectangle.Fill = myBrush;

        // Add the rectangle to the tree.
        LayoutRoot.Children.Add(myRectangle);

        // Create a duration of 2 seconds.
        Duration duration = new Duration(TimeSpan.FromSeconds(2));

        // Create two DoubleAnimations and set their properties.
        DoubleAnimation myDoubleAnimation1 = new DoubleAnimation();
        DoubleAnimation myDoubleAnimation2 = new DoubleAnimation();

        myDoubleAnimation1.Duration = duration;
        myDoubleAnimation2.Duration = duration;

        Storyboard sb = new Storyboard();
        sb.Duration = duration;

        sb.Children.Add(myDoubleAnimation1);
        sb.Children.Add(myDoubleAnimation2);

        Storyboard.SetTarget(myDoubleAnimation1, myRectangle);
        Storyboard.SetTarget(myDoubleAnimation2, myRectangle);

        // Set the attached properties of Canvas.Left and Canvas.Top
        // to be the target properties of the two respective DoubleAnimations.
        Storyboard.SetTargetProperty(myDoubleAnimation1, new PropertyPath("(Canvas.Left)"));
        Storyboard.SetTargetProperty(myDoubleAnimation2, new PropertyPath("(Canvas.Top)"));

        myDoubleAnimation1.To = 200;
        myDoubleAnimation2.To = 40;

        // Make the Storyboard a resource.
        LayoutRoot.Resources.Add("unique_id", sb);

        // Begin the animation.
        sb.Begin();

好的,我使用的是 Silverlight 的示例。

我在这里找到了 C# UWP 示例:

故事板类 ,它现在可以工作,但它改变了矩形的位置而不是宽度。如何更改要应用于 Rectangle 的 Width 属性的过渡?

新代码是这样的:

    private void Create_And_Run_Animation()
    {

        // Create a red rectangle that will be the target
        // of the animation.
        Rectangle myRectangle = new Rectangle();
        myRectangle.Width = 20;
        myRectangle.Height = 20;
        SolidColorBrush myBrush = new SolidColorBrush(Colors.Yellow);
        myRectangle.Fill = myBrush;

        // Create the transform
        TranslateTransform stretchTransform = new TranslateTransform();
        stretchTransform.X = 0;
        stretchTransform.Y = 0;
        myRectangle.RenderTransform = stretchTransform;

        // Add the rectangle to the tree.
        InfoGrid.Children.Add(myRectangle);
        myRectangle.Name = "myWidthAnimatedRectangle";
        // Create a duration of 2 seconds.
        Duration duration = new Duration(TimeSpan.FromSeconds(2));
        // Create two DoubleAnimations and set their properties.
        DoubleAnimation myDoubleAnimation = new DoubleAnimation();
        myDoubleAnimation.From = 200;
        myDoubleAnimation.To = 300;
        myDoubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(3000));
        Storyboard justintimeStoryboard = new Storyboard();
        justintimeStoryboard.Duration = duration;
        justintimeStoryboard.Children.Add(myDoubleAnimation);

        Storyboard.SetTarget(myDoubleAnimation, stretchTransform);

        Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
        Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(Rectangle.WidthProperty));
        // Set the X and Y properties of the Transform to be the target properties
        // of the two respective DoubleAnimations.
        Storyboard.SetTargetProperty(myDoubleAnimation, "X");

        myDoubleAnimation.To = 200;


        // Make the Storyboard a resource.
        InfoGrid.Resources.Add("justintimeStoryboard", justintimeStoryboard);
        // Begin the animation.
        justintimeStoryboard.Begin();
    }

但我无法在 UWP 中获得 Rectangle.WidthProperty。Intelli 说:

无法从“Windows.UI.Xaml.DependencyProperty”转换为“字符串”

我在 MSDN 上找不到资源。

4

1 回答 1

2

无法从“Windows.UI.Xaml.DependencyProperty”转换为“字符串”

问题是方法的Path参数SetTargetProperty是字符串值。你不能传给PropertyPath它。您只需要传递Width字符串值。

DoubleAnimation myDoubleAnimation = new DoubleAnimation();
myDoubleAnimation.From = 20;
myDoubleAnimation.To = 300;
myDoubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(3000));

Storyboard.SetTarget(myDoubleAnimation, myRectangle);
Storyboard.SetTargetProperty(myDoubleAnimation, "Width");
Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);

如果您使用以下代码使用属性进行动画处理,您将看不到任何效果。因为你做了一个依赖动画。默认情况下,动画系统不会运行依赖动画。您仍然可以使用此动画,但您必须专门启用每个此类相关动画。要启用动画,请将EnableDependentAnimation动画对象的属性设置为 true。

myDoubleAnimation.EnableDependentAnimation = true; 

更多内容请参考Storyboarded 动画官方文档。

于 2018-03-16T10:38:57.013 回答