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

КОД:

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

+0

Да, именно я хочу это сделать. – Samet

ответ

1

Вы вводите в заблуждение несколько вещей здесь.

Во-первых, анимация не будет работать вечно только потому, что вы не устанавливаете ее продолжительность. Вместо этого продолжительность DoubleAnimation по умолчанию равна 1 секунде, а затем останавливается.

Во-вторых, свойство анимации To не изменится волшебным путем только потому, что вы изменили переменную, которую вы назначили ей заранее. Изменения свойств анимации будут проигнорированы в любом случае после его запуска.

Я думаю, что использование анимаций - неправильный подход к решению вашей проблемы. То, что вы хотите достичь (непрерывно движущийся объект со сменными векторами скорости), возможно, лучше всего сделать, используя DispatcherTimer и циклически обновляя положение объекта в соответствии с прошедшим временем.

Следующий пример кода может дать вам представление о том, как это работает. Теперь вы можете изменить вектор скорости, как вам нравится (установив speed.X и speed.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

+0

Добро пожаловать. Обратите внимание: класс Vector имеет некоторые полезные методы для векторной арифметики. – Clemens

Смежные вопросы