2013-03-02 83 views
0

我无法弄清楚如何在运行时移动WPF形状。具体来说,我想移动一个椭圆。移动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(); 
+0

我试过了,它没有工作。 – tentmaking 2013-03-02 18:55:55

+0

你如何创建和启动计时器? – Clemens 2013-03-02 19:09:37

+0

我将该代码添加到帖子 – tentmaking 2013-03-02 19:18:46

回答

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属性来获得平稳的运动。开始阅读这里:Animation Overview

+0

这种方法不起作用。我必须在其他地方的代码中做错事。 – tentmaking 2013-03-02 19:28:11

+0

您也可以在声明Ellipse的位置发布XAML。 – Clemens 2013-03-02 19:40:40