-1

我正在使用带有xna的winforms。到目前为止一切正常,除了绘图。这是我的初始代码:

        protected override void Draw()
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin();
            tileSheet.Draw(spriteBatch);
            foreach (Image img in selector)
                img.Draw(spriteBatch);
            spriteBatch.End();
        }

我放置了一个断点,它正在调用 draw 方法,但屏幕上没有任何变化,但是当我这样做时:

protected override void Draw()
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();
        tileSheet.Draw(spriteBatch);
        foreach (Image img in selector)
            img.Draw(spriteBatch);
        spriteBatch.End();

        Invalidate();
    }

有用!但问题是一切都被冻结了,而且似乎陷入了无效循环。但是为什么后者有效而前者无效?我已经为此工作了几个小时,但我不明白出了什么问题:/。

我觉得这很简单,但我无法理解它。

我也尝试过更新和刷新,但它们也不起作用。

4

1 回答 1

0

Invalidate 调用 Draw 1,因此 Invalidate 混合在一起, Invalidate -> Draw -> Invalidate -> Draw -> ..

“修复”是不要在平局中无效。相反,仅调用 Invalidate 以响应需要 [re]draw 的输入。在“不工作”(但确实有效!)前者的情况下,请确保在适当的情况下调用 Invalidate - 但来自绘图处理程序之外。


1 Invalidate “稍后”调用 Draw,但它是一个异步操作。它有效地发布一条消息,WinForms 进程在窗口消息循环中处理,然后调用 OnPaint,最后调用 Draw。但是,从 Draw 调用 Invalidate 会导致“更新太多太快”。

于 2013-09-20T02:50:12.670 回答