2012-02-20 27 views
0

我想通过单击按钮来移动圆。例如;将绘制的圆移动到C#中的固定位置WPF

(0,0)的位置上有圆形,我想通过单击X +按钮来移动它。这将在X位置不停止和循环移动的情况下逐个增加X.然后,当我点击Y +按钮时,它会将Y增加20倍,并且圆圈也开始在Y轴上移动。

我有一个代码,但我无法动态地移动它。它移动到预定位置。

XAML:

<Window x:Class="circle_animation.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" Closed="Window_Closed" > 
<Canvas> 
    <Ellipse Width="10" Height="10" Canvas.Left="0" Canvas.Top="0" Fill="Black" x:Name="el" /> 
    <Button Canvas.Left="255" Canvas.Top="266" Content="Move On X" Height="23" Width="75" Click="Button_Click" /> 
    <Button Canvas.Left="139" Canvas.Top="272" Content="Move On Y+" Height="23" Name="button1" Width="75" Click="Button2_Click" /> 
</Canvas> 

CODE:

public int X; 
    public int Y; 

    public bool inside = true; 


    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 


     if (inside) 
     { 

      DoubleAnimation animatex = new DoubleAnimation(); 

      animatex.To = X; 
      el.BeginAnimation(Canvas.LeftProperty, animatex); 

      DoubleAnimation animatey = new DoubleAnimation(); 
      animatey.To = Y; 

      el.BeginAnimation(Canvas.TopProperty, animatey); 

     } 
    } 


    public void Button_Click(object sender, RoutedEventArgs e) 
    { 

     if (inside) 
     { 
      X++; 
     } 
    } 

    public void Button2_Click(object sender, RoutedEventArgs e) 
    { 

     Y = Y + 20; 
    } 

这是我的主意,以动态地移动它,但它不工作。你能帮我吗 ?我在哪里做错了?

+0

你期待的是,圆连续移动,并通过改变X和Y你神奇地改变其“速度矢量”? – Clemens 2012-02-20 19:34:51

+0

是的,我确实想这样做。 – Samet 2012-02-20 19:48:26

回答

1

你在这里混淆了一些事情。

首先,动画不会因为没有设置其持续时间而永远运行。相反,DoubleAnimation的默认持续时间是1秒,然后停止。

其次,动画的To属性不会因为您事先更改您分配给它的变量而奇迹般地更改。无论如何,对动画特性的更改在启动后将被忽略。

我认为使用动画是解决问题的错误方法。你想达到什么(一个速度矢量可变的连续移动的物体)最好通过利用一个DispatcherTimer并根据经过的时间循环更新物体的位置来完成。

下面的示例代码可能会给你一个关于如何工作的想法。您现在可以更改速度矢量(只要按一下按钮即可设置speed.Xspeed.Y),并且对象将相应地移动。可能的优化不是立即启动定时器,而是只有当矢量变为非零时,并在速度变为零时再次停止。

private DispatcherTimer timer = new DispatcherTimer(); // timer object 
private Vector speed = new Vector(0, 0); // movement in pixels/second, initially zero 

public MainWindow() 
{ 
    InitializeComponent(); 

    timer.Interval = TimeSpan.FromMilliseconds(50); // update 20 times/second 
    timer.Tick += TimerTick; 
    timer.Start(); 
} 

private void TimerTick(object sender, EventArgs e) 
{ 
    // movement in one interval 
    double dx = speed.X * timer.Interval.TotalSeconds; 
    double dy = speed.Y * timer.Interval.TotalSeconds; 
    // update position 
    Canvas.SetLeft(el, Canvas.GetLeft(el) + dx); 
    Canvas.SetTop(el, Canvas.GetTop(el) + dy); 
} 
+0

该解决方案奏效。非常感谢。我刚刚意识到这个椭圆必须具有像12点那样的初始程度。当我点击Y按钮时,它必须设置度数,然后X按钮触发器开始在那个位置上移动..我现在将处理这个...谢谢。我还会问另一个问题。 – Samet 2012-02-20 21:52:23

+0

不客气。请注意Vector类有一些非常有用的矢量算术方法。 – Clemens 2012-02-20 21:56:47