C # переместить полилинию - PullRequest
4 голосов
/ 23 декабря 2010

Я новичок в графическом программировании на C #. Вчера я начал один новый проект (WPF). Есть объект Polyline, который мне нужно перемещать по экрану с координатами, которые я вычисляю. Я не знаю, как переместить объект и сделать что-то вроде анимации. При наведении мыши я хочу запустить этот метод Move(), после этого перейти в цикл while, а когда условие будет выполнено (end == true), я хочу завершить цикл и завершить анимацию. И пока я нахожусь в цикле, моя идея состоит в том, чтобы двигать полилинию медленными движениями. Я пытался вставить Move() в поток и использовать Thread.Sleep(...);, но я мог видеть только конечную позицию, а не весь путь полилинии. Я пытался положить его в new Thread(new ThreadStart(Move)); ... и this.Dispatcher.BeginInvoke, эффект был тот же. Подскажите, пожалуйста, как я могу сделать это движение?

     public void Move()
     {
        bool end = false;
        while (!end)
        {
            double x = lastPosX;
            double y = lastPosY;

            double a = y1 - y;
            double b = x - x1;
            double c = -x * y1 + x1 * y;

            double u, v;
            GetC(out u, out v);                    

            if (y1 < lastPosY)
            {
                GetCoordinates(ref u, ref v);
            }

            if (u > width || v > height)
            {
                 gameEnd = true;
            }

            lastPosX = u;
            lastPosY = v;

            p.Points.Remove(p.Points.First());
            p.Points.Add(new Point(u, v));

          }

       }

1 Ответ

1 голос
/ 23 декабря 2010

Я не смог понять, как работает ваш метод Move, но вот пример того, как вы можете перемещать ломаную линию слева направо при MouseDown. Надеюсь, вы сможете адаптировать его к вашим потребностям

Xaml

<Canvas Name="myCanvas">
    <Polyline Name="myPolyline"
              MouseDown="Polyline_MouseDown"
              Canvas.Left="75"
              Canvas.Top="50"
              Points="25,25 0,50 25,75 50,50 25,25 25,0" 
              Stroke="Blue"
              StrokeThickness="10"/>
</Canvas>

Код позади

private void Polyline_MouseDown(object sender, MouseButtonEventArgs e)
{
    double left = Canvas.GetLeft(myPolyline);
    var animationThread = new Thread(new ThreadStart(() =>
    {
        while (left < 300)
        {
            left += 10;
            // SetLeft is done in the UI thread
            Dispatcher.Invoke(new Action(() =>
            {
                Canvas.SetLeft(myPolyline, left);
            }));
            Thread.Sleep(50);
        }
    }));
    animationThread.Start();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...