Winforms Invalidate не запускается OnPaint - PullRequest
1 голос
/ 18 декабря 2009

Я пытаюсь плавно перемещать форму, используя код, указанный на вопросе Как плавно анимировать расположение 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();
    }
}

1 Ответ

3 голосов
/ 18 декабря 2009

Код в связанном вопросе использует Application.DoEvents, который является ключевой частью для разрешения OnPaint.
Без этого вы могли бы использовать Form.Refresh () вместо Invalidate.

Подробнее см. этот вопрос .

Edit:

Ваш код показывает некоторые проблемы, но он не завершен. Давайте начнем с основ, чтобы сделать перемещение формы, все, что вам нужно, это включить таймер и это:

private void timer1_Tick(object sender, EventArgs e)
{            
    this.Location = new Point(this.Location.X + 2, this.Location.Y + 1);
}
...