Что-то о перемещении фигур в Canvas в WPF - PullRequest
2 голосов
/ 16 октября 2011

У меня есть прямоугольник, который нужно переместить, используя Canvas.SetLeft(rect, x);

Но я хочу, чтобы он выглядел как плавный переход (анимация).Вот фрагмент кода, который должен это сделать:

void animate()
    {
        for (int a = 0; a < 10; a++)
        {
            MainWindow.current.Dispatcher.BeginInvoke(new Action(move));
            x += 10;
            Thread.Sleep(100);
        }
    }

    void move()
    {
        Canvas.SetLeft(rect, x);
    }

Это кажется очень простым, но у меня возникают проблемы с этим.Я хочу, чтобы поток немного поспал, а затем установил для прямоугольника x новое значение.Но вместо этого нить спит 30*10 миллисекунд, а затем прямоугольник мгновенно перемещается вправо на 10 * 10 единиц.Я не могу получить эффект анимации, который хочу.И я знаю, что я вызвал Sleep в потоке GUI, но я не думаю, что это должно повлиять на анимацию.

Ответы [ 2 ]

2 голосов
/ 16 октября 2011

Вместо того, чтобы заставлять ваш поток пользовательского интерфейса спать.Я бы предложил вам использовать Storyboard Animation, предоставленный WPF специально для этой цели.Эта ссылка поможет вам начать, если вы тоже что-то новое -

http://vbcity.com/blogs/xtab/archive/2009/12/28/wpf-simple-animations-to-move-and-resize-elements-simultaneously.aspx

1 голос
/ 16 октября 2011

Это не будет успехом.Во-первых, у вас есть проблема с потоками, Sleep () в потоке пользовательского интерфейса блокирует обновления экрана.Использование другого потока в лучшем случае даст плохие результаты.

И вам это не нужно, просто научитесь определять анимацию (<Storyboard />) в XAML.Вы можете вызвать их из C #.

Редактировать

Попробуйте и посмотрите этот маленький фрагмент:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        label1.Content = "Click";
        Thread.Sleep(2500);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...