Я пытаюсь плавно перемещать форму, используя код, указанный на вопросе Как плавно анимировать расположение Windows Forms с разными скоростями?
Но по какой-то причине мой вызов this.Invalidate () никогда не вызовет событие OnPaint. Есть ли какая-либо конфигурация, которая требуется в форме, чтобы это было возможно?
Edit:
Потоки задействованы, так как они выполняются в фоновом режиме с собственным циклом сообщений. Вот код:
public class PopupWorker
{
public event PopupRelocateEventHandler RelocateEvent;
private BackgroundWorker worker;
private MyPopup popupForm;
public PopupWorker()
{
worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
popupForm = PopupCreator.CreatePopup("Title", "BodyText");
this.RelocateEvent += popupForm.OnRelocate;
popupForm.CustomShow();
Application.Run();
}
public void Show()
{
worker.RunWorkerAsync();
}
public void PopupRelocate(object sender, Point newLocation)
{
if (popupForm.InvokeRequired)
popupForm.Invoke(new PopupRelocateEventHandler(PopupRelocate), new object[] {sender, newLocation});
else
RelocateEvent(this, newLocation);
}
}
Форма:
public void OnRelocate(object sender, Point newLocation)
{
targetLocation = newLocation;
this.Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (Location.Y != targetLocation.Y)
{
Location = new Point(Location.X, Location.Y + 10);
if (Location.Y > targetLocation.Y)
Location = targetLocation;
this.Invalidate();
}
}