对于Windows Phone应用程序,在C#上的映像上应用转换

时间:2015-05-03 14:20:35

标签: c# windows-phone transform translation

我正在开发一款迷你游戏,我需要使用翻译转换将图像从初始位置转移到另一个位置。

问题是:我不知道如何继续应用翻译。

所以这是用于生成图像的代码。

Image myImage1 = new Image();
myImage1.Source = new BitmapImage(new Uri("/Images/image1.png", UriKind.Relative));
myImage1.Name = "image" + index++.ToString();
myImage1.Tap += myImage_Tap;

Canvas.SetLeft(image, 200);
Canvas.SetTop(image, 600);

gameArea.Children.Add(image);

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

您有两种选择来移动图像。第一种是像你的代码一样使用Canvas,但你必须确保你的元素实际上在Canvas中。你的“gameArea”是画布吗?如果不是,您的代码将无法正常工作。另一种选择是使用Transforms。

var myImage1 = new Image
{
    Source = new BitmapImage(new Uri("/Images/image1.png", UriKind.Relative)),
    Name = "image" + index++.ToString(),
    Tap += myImage_Tap,
    RenderTransform = new TranslateTransform
    {
        X = 200,
        Y = 600
    }
};

gameArea.Children.Add(image);

现在gameArea可以是任何类型的Panel,它可以工作。

请注意,使用Canvas时,Top和Left将位于Canvas的左上角。使用变换时,您的X和Y将相对于最初绘制元素的位置。

UPDATE - Helper类使用Canvas

执行简单的动画
public sealed class ElementAnimator
{
    private readonly UIElement _element;

    public ElementAnimator(UIElement element)
    {
        if (null == element)
        {
            throw new ArgumentNullException("element", "Element can't be null.");
        }

        _element = element;
    }

    public void AnimateToPoint(Point point, int durationInMilliseconds = 300)
    {
        var duration = new Duration(TimeSpan.FromMilliseconds(durationInMilliseconds));

        var easing = new BackEase
        {
            Amplitude = .3
        };

        var sb = new Storyboard
        {
            Duration = duration
        };

        var animateLeft = new DoubleAnimation
        {
            From = Canvas.GetLeft(_element),
            To = point.X,
            Duration = duration,
            EasingFunction = easing,
        };

        var animateTop = new DoubleAnimation
        {
            From = Canvas.GetTop(_element),
            To = point.Y,
            Duration = duration,
            EasingFunction = easing,
        };

        Storyboard.SetTargetProperty(animateLeft, "(Canvas.Left)");
        Storyboard.SetTarget(animateLeft, _element);

        Storyboard.SetTargetProperty(animateTop, "(Canvas.Top)");
        Storyboard.SetTarget(animateTop, _element);

        sb.Children.Add(animateLeft);
        sb.Children.Add(animateTop);

        sb.Begin();
    }
}

答案 1 :(得分:0)

所以这就是我对你的代码所做的,我只使用了这部分并使其成为一个函数:

public void AnimateToPoint(UIElement image, Point point, int durationInMilliseconds = 300)
{
    var duration = new Duration(TimeSpan.FromMilliseconds(durationInMilliseconds));

    var sb = new Storyboard
    {
        Duration = duration
    };

    var animateTop = new DoubleAnimation
    {
        From = Canvas.GetTop(image),
        To = point.Y,
        Duration = duration
    };

    Storyboard.SetTargetProperty(animateTop, new PropertyPath("Canvas.Top")); // You can see that I made some change here because I had an error with what you gave me
    Storyboard.SetTarget(animateTop, image);

    sb.Children.Add(animateTop);

    sb.Begin();
}

然后我打电话给:

Point myPoint = new Point(leftpos, 300); // leftpos is a variable generated randomly
AnimateToPoint(myImage, myPoint);

所以现在仍然有一个错误,它在指令“sb.Begin;”中。 它说:无法解析指定对象上的TargetProperty Canvas.Top。 我真的不知道该怎么办。 感谢您之前的回答!