Перемещение нарисованного круга в исходное положение в C # WPF - PullRequest
0 голосов
/ 20 февраля 2012

Я бы хотел переместить круг, нажимая кнопки. Например;

В позиции (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;
    }

Это была моя идея динамически перемещать ее, но она не работает. Не могли бы вы мне помочь ? Где я делаю не так?

1 Ответ

1 голос
/ 21 февраля 2012

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

Во-первых, анимация не будет работать вечно только потому, что вы не установили ее продолжительность. Вместо этого продолжительность 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);
}
...