0

我无法弄清楚如何在运行时移动 WPF 形状。具体来说,我想移动一个椭圆。

这是我当前的代码:

private void Tick(object sender, EventArgs e)
    {
        Point ballLocation = ball.TransformToAncestor(Application.Current.MainWindow).Transform(new Point(0, 0));
        //MessageBox.Show(ballLocation.ToString());
        Canvas.SetLeft(ball, ballLocation.X + 5);

        InvalidateVisual();
    }

每次计时器滴答(1 秒),球应该在 x 方向移动 5 个像素,对吗?如果这是错误的,如何获取 Ellipse 的当前位置以及如何将其设置为新位置。也许 InvalidateVisual 有问题?我相信这基本上会重新绘制控件。如果这是错误的,我如何重新绘制椭圆以显示其位置的变化。我也试过ball.InvalidateVisual(),它没有用。

这就是我创建和启动计时器的方式:

var timer = new DispatcherTimer {IsEnabled = true};
        timer.Tick += Tick;
        timer.Interval = new TimeSpan(0, 0, 1);
        timer.Start();
4

1 回答 1

0

如果Canvas.Left使用某个值初始化,则在 XAML 中

<Ellipse Name="ball" Canvas.Left="0" ... />

或在代码中

Canvas.SetLeft(ball, 0);

以下作品:

void Tick(object sender, EventArgs e)
{
    Canvas.SetLeft(ball, Canvas.GetLeft(ball) + 5);
}

初始化是必要的,因为默认值为Double.NaN.


但是,您可以考虑为Canvas.Left属性设置动画以获得平滑的移动。从这里开始阅读:动画概述

于 2013-03-02T19:01:30.343 回答