C# UI元素';什么是动画?

C# UI元素';什么是动画?,c#,xaml,animation,windows-phone-8.1,C#,Xaml,Animation,Windows Phone 8.1,我不熟悉Windows Phone开发,因此我对故事板不太熟悉,不知道它们是否适合我这种情况 我有一个画布,我在上面放置了一个矩形。我希望矩形在调用其move方法时沿随机方向平滑移动(通过处理平移和拾取x和y来处理) 在游戏《突破》之前,我制作了一个简单的Java应用程序,通过在while循环中将球移动到非常靠近的位置,并暂停一定数量的while循环,以便您可以在窗口中看到球移动的动画,来处理球的移动。我想知道在这种情况下,我是否可以使用while循环来做同样的事情,因为我相信这是我计划用我的应

我不熟悉
Windows Phone
开发,因此我对
故事板不太熟悉,不知道它们是否适合我这种情况

我有一个
画布
,我在上面放置了一个
矩形
。我希望矩形在调用其move方法时沿随机方向平滑移动(通过处理平移和拾取x和y来处理)

在游戏《突破》之前,我制作了一个简单的Java应用程序,通过在while循环中将球移动到非常靠近的位置,并暂停一定数量的while循环,以便您可以在窗口中看到球移动的动画,来处理球的移动。我想知道在这种情况下,我是否可以使用while循环来做同样的事情,因为我相信这是我计划用我的应用程序做的最好的事情

当点击矩形时,我尝试了以下操作:

private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
    int x = 1;
    while (x < 50)
    {
         double d = Canvas.GetLeft(TestRectangle);
         Canvas.SetLeft(TestRectangle, d + 1);
         TestCanvas.UpdateLayout();
         System.Threading.Tasks.Task.Delay(5).Wait();
         x++;
    }
   /*
    int y = 1;
    while(y < 200)
    {
        dragTranslation.Y += 1;
        TestCanvas.UpdateLayout();
        System.Threading.Tasks.Task.Delay(1).Wait();
        y++;
    }
    * */  
}
private void TestRectangle\u点击(对象发送方,点击路由Deventargs e)
{
int x=1;
而(x<50)
{
double d=Canvas.GetLeft(TestRectangle);
SetLeft(TestRectangle,d+1);
TestCanvas.UpdateLayout();
System.Threading.Tasks.Task.Delay(5.Wait();
x++;
}
/*
int y=1;
而(y<200)
{
dragtransation.Y+=1;
TestCanvas.UpdateLayout();
System.Threading.Tasks.Task.Delay(1.Wait();
y++;
}
* */  
}
问题是这个更新不够快,所以当矩形移动时,我没有得到一个平滑的动画,当单击它时,它几乎会跳到它的最终位置

我如何才能做到这一点,因为我最终想要使矩形在屏幕上随机移动,并与画布的边缘发生碰撞


如果我不得不使用
情节提要
,有人能告诉我一个沿随机路径移动对象的例子吗(使用C#而不是XAML)。

XAML和Expression Blend是创建动画的简单方法

下面是定义故事板和动画的XAML

XAML

<Page.Resources>
  <Storyboard x:Name="MoveRectangleStoryboard"
              Completed='MoveRectangle_Completed'>
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
                                    Storyboard.TargetName="TestRectangle">
      <EasingDoubleKeyFrame KeyTime="0"
                            Value="0"
                            x:Name='xKey1' />
      <EasingDoubleKeyFrame KeyTime="0:0:2"
                            Value="165.423"
                            x:Name='xKey2' />

    </DoubleAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
                                    Storyboard.TargetName="TestRectangle">
      <EasingDoubleKeyFrame KeyTime="0"
                            Value="0"
                            x:Name='yKey1' />
      <EasingDoubleKeyFrame KeyTime="0:0:2"
                            Value="68.408"
                            x:Name='yKey2' />

    </DoubleAnimationUsingKeyFrames>
  </Storyboard>
</Page.Resources>

  <Canvas x:Name='MainCanvas'>
    <Rectangle x:Name="TestRectangle"
               Fill='Orange'
               Tapped='rectangle_Tapped'
               Width='60'
               Height='80'
               RenderTransformOrigin="0.0,0.0">
      <Rectangle.RenderTransform>
        <CompositeTransform />
      </Rectangle.RenderTransform>
    </Rectangle>
  </Canvas>

代码中UIElement的
Canvas.Left
Canvas.Top
属性的直观动画如下所示:

public void MoveElement(
    UIElement element, double offsetX, double offsetY, TimeSpan duration)
{
    var xAnimation = new DoubleAnimation
    {
        To = Canvas.GetLeft(element) + offsetX,
        Duration = duration,
    };

    var yAnimation = new DoubleAnimation
    {
        To = Canvas.GetTop(element) + offsetY,
        Duration = duration,
    };

    Storyboard.SetTarget(xAnimation, element);
    Storyboard.SetTargetProperty(xAnimation, "(Canvas.Left)");
    Storyboard.SetTarget(yAnimation, element);
    Storyboard.SetTargetProperty(yAnimation, "(Canvas.Top)");

    var storyboard = new Storyboard();
    storyboard.Children.Add(xAnimation);
    storyboard.Children.Add(yAnimation);
    storyboard.Begin();
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
    MoveElement(TestRectangle, 50, 50, TimeSpan.FromSeconds(0.25));
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
    MoveElement((UIElement)sender, 50, 50, TimeSpan.FromSeconds(0.25));
}
您可以在点击处理程序中使用它,如下所示:

public void MoveElement(
    UIElement element, double offsetX, double offsetY, TimeSpan duration)
{
    var xAnimation = new DoubleAnimation
    {
        To = Canvas.GetLeft(element) + offsetX,
        Duration = duration,
    };

    var yAnimation = new DoubleAnimation
    {
        To = Canvas.GetTop(element) + offsetY,
        Duration = duration,
    };

    Storyboard.SetTarget(xAnimation, element);
    Storyboard.SetTargetProperty(xAnimation, "(Canvas.Left)");
    Storyboard.SetTarget(yAnimation, element);
    Storyboard.SetTargetProperty(yAnimation, "(Canvas.Top)");

    var storyboard = new Storyboard();
    storyboard.Children.Add(xAnimation);
    storyboard.Children.Add(yAnimation);
    storyboard.Begin();
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
    MoveElement(TestRectangle, 50, 50, TimeSpan.FromSeconds(0.25));
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
    MoveElement((UIElement)sender, 50, 50, TimeSpan.FromSeconds(0.25));
}
或者不命名矩形,如下所示:

public void MoveElement(
    UIElement element, double offsetX, double offsetY, TimeSpan duration)
{
    var xAnimation = new DoubleAnimation
    {
        To = Canvas.GetLeft(element) + offsetX,
        Duration = duration,
    };

    var yAnimation = new DoubleAnimation
    {
        To = Canvas.GetTop(element) + offsetY,
        Duration = duration,
    };

    Storyboard.SetTarget(xAnimation, element);
    Storyboard.SetTargetProperty(xAnimation, "(Canvas.Left)");
    Storyboard.SetTarget(yAnimation, element);
    Storyboard.SetTargetProperty(yAnimation, "(Canvas.Top)");

    var storyboard = new Storyboard();
    storyboard.Children.Add(xAnimation);
    storyboard.Children.Add(yAnimation);
    storyboard.Begin();
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
    MoveElement(TestRectangle, 50, 50, TimeSpan.FromSeconds(0.25));
}
private void TestRectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
    MoveElement((UIElement)sender, 50, 50, TimeSpan.FromSeconds(0.25));
}

我知道你只要求C#,但我发现使用Blend生成动画很容易,然后在文本编辑器和代码编辑器中编辑结果。好的,谢谢。我有几个问题。尝试此操作时,我收到一个错误,说明找不到类型或命名空间名称DoubleAnimation,System.Windows.Media.Animation.Storyboard不包含“Children”的定义。我错过了什么?谢谢,不用客气。我想我明白了。缺少对Windows.UI.Xaml.Media.Animation的引用;我怎样才能添加到它,使它无限期地运行?我最终希望它继续移动,直到满足一个条件,并让它检查它是否反弹到画布的边界等(我假设我会检查它是否在(to=canvas.GetLeft(element)+offset?)中超出画布)?我试图将其放入一个while循环,但我的应用程序无法打开。此外,当我只希望动画继续朝其方向移动时,重复行为将重置动画(如果它撞到墙上,则更改x或y)直到满足条件?是否最好将持续时间设置为较长的时间段,因为我还计划,如果在一定时间后未满足条件,我希望“游戏结束”。如果希望动画运行直到对象“撞到墙”,则计算移动距离(和持续时间)相对于启动动画之前的当前位置。若要在动画完成时获得通知,故事板将有一个事件。请附加事件处理程序并在那里开始另一个移动。