#c# #wpf #animation #shapes
#c# #wpf #Анимация #фигуры
Вопрос:
У меня есть прямоугольник, который нужно переместить с помощью 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, но я не думаю, что это должно повлиять на анимацию.
Ответ №1:
Вместо того, чтобы переводить поток пользовательского интерфейса в спящий режим. Я бы посоветовал вам использовать Storyboard Animation
предоставленный WPF специально для этой цели. Эта ссылка поможет вам начать, если это тоже что-то новое для вас —
Комментарии:
1. Я собираюсь решить лабиринт, определенный пользователем графически. Итак, будет ли использование анимации раскадровки эффективным для перемещения блока? потому что я хочу перемещать его в любом направлении, увеличивать скорость и так далее.. (Я хочу иметь полный контроль над своим блоком)
2. Это то, для чего предназначена раскадровка. Это даст вам плавную анимацию, по крайней мере, лучше, чем позволить вашему потоку спать.
Ответ №2:
Это не будет успешным. Во-первых, у вас проблема с потоками, Sleep() в потоке пользовательского интерфейса блокирует обновления экрана. Использование другого потока в лучшем случае даст плохие результаты.
И вам это не нужно, просто узнайте, как определить animations ( <Storyboard />
) в XAML. Вы можете запускать их из C #.
Редактировать
Попробуйте и посмотрите этот небольшой фрагмент:
private void button1_Click(object sender, RoutedEventArgs e)
{
label1.Content = "Click";
Thread.Sleep(2500);
}
Комментарии:
1. Я попробую раскадровку, но не могли бы вы сказать мне, какая проблема с потоками у меня здесь? Поток GUI не блокируется и поэтому не может обновлять положение прямоугольника или нет?
2. Почему метка обновляется через 2,5 секунды !!? Он должен обновить содержимое метки, А ЗАТЕМ перейти в режим ожидания на 2,5 секунды, верно???
3. Рушил, это демонстрирует, как работает обновление в WPF (и WinForms). Вам нужен поток пользовательского интерфейса, чтобы обновить метку.