2012-02-20 62 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