c# Перемещение контрола
Суть задачи: мне нужно влево-вправо немного подвигать контрол при нажатии кнопки (буквально на 15 поинтов). "А-ля анимация в WinForms". Возможно ли в WinForms их вообще программно перемещать без артефактов и плавно (хоть как-нибудь...). Вся моя реализация:
private async Task Shake(Control control)
{
var startPos = control.Location;
for (int i = 1; i <= 5; i++)
{
control.Location = new Point(control.Location.X + i,control.Location.Y);
await Task.Delay(TimeSpan.FromMilliseconds(1));
}
for (int i = 1; i <= 2; i++)
{
for (int j = 1; j <= 10; j++)
{
control.Location = new Point(control.Location.X - j, control.Location.Y);
await Task.Delay(TimeSpan.FromMilliseconds(1));
}
for (int j = 1; j <= 10; j++)
{
control.Location = new Point(control.Location.X + j, control.Location.Y);
await Task.Delay(TimeSpan.FromMilliseconds(1));
}
}
control.Location = startPos;
}
private void button_Click(object sender, EventArgs e)
{
Shake(mainTextBox); //textbox
}
Весь "прикол" в том, что либо это происходит слишком быстро, что даже не заметно, либо с артефактами (в формате "частичек" этого контрола) (мб выглядит слишком "колхозно", но постарался хоть как-нибудь реализовать, т.к. впервые с конкретно этой темой сталкиваюсь
Ответы (1 шт):
Если вы хотите контролировать скорость, то двигать надо в таймере. Вот примерный код на коленке (Все контролы создаются в рантайме, на форму кидать ничего не нужно. По нажатию одной кнопки другая плавно двигается вправо.)
Timer mover = new Timer();//Таймер
Button button1 = new Button();//Контрол, который мы будем двигать
private void Main_Load(object sender, EventArgs e)
{
mover.Interval = 1;//Интервал передвижения в миллисекундах
Button button = new Button();//Кнопка по нажатию которой мы будем запускать таймер
button.Location = new Point(40, 40);//Позиция вышеописанной кнопки
button.Size = new Size(100, 40);//Её размер
button.Text = "Move";//Е текст
button.Click += new EventHandler(butLabel_Click);//Обработчик события клика
Controls.Add(button);//Добавление этой кнопки на форму
button1.Location = new Point(100, 100);//Позиция двигающегося контрола
button1.Size = new Size(40, 40);//Его размер
Controls.Add(button1);//Добавляем на форму
}
private void butLabel_Click(object sender, EventArgs e)//Метод описывающий действия, происходящие по нажатию первой кнопки
{
mover.Tick += TimerDoWork;//Обработчик события каждого тика таймера
mover.Enabled = true;//Включаем таймер
mover.Start();//Запускаем таймер
}
private void TimerDoWork(object sender, EventArgs e)//Метод, описывающий действия, которые будут происходить при каждом тике таймера
{
button1.Location = new Point(button1.Location.X + 1, button1.Location.Y);//Преемещение двигающегося контрола на 1 пиксель вправо
}