在某些条件被清除后,有没有办法调用OnPaint()方法?

时间:2013-12-30 03:11:08

标签: c# winforms onpaint

我的桌面现在非常混乱所以我决定创建一个程序,您可以在其中拖动文件并创建快捷方式。当文件被拖入时,我抓取文件的图标和名称并保存,然后通过OnPaint()将它们绘制到WinForm。我遇到这个问题,因为即使在我将文件拖入表单之前,OnPaint()也会绘制一个巨大的红色X并且不会更新。这是我的代码(这是一张图片):

enter image description here

OnPaint方法:

enter image description here

我的问题是,无论如何都要延迟OnPaint()方法等到它获取正确绘制所需的某些数据,或者我可以使用任何其他绘图方法将图标+文件名粘贴到WinForm?

P.S:我尝试过使用Thread.Sleep,但后来我意识到它睡眠了主线程,因此不会发生拖放过程

1 个答案:

答案 0 :(得分:1)

我看到两个选项。

首先是我在评论中所说的内容..使表单无效以使OnPaint在拖放后被调用:

foreach (string path in filePath)
{
    // your other code here (PS: Paste code next time)
}

this.Invalidate();

您的另一个选择..是使用您可以在OnPaint

中查看的标记
bool canDraw = false;

// dragdrop event:

foreach (string path in filePath)
{
    // your other code here (PS: Paste code next time)
}

canDraw = true;

// OnPaint:

if (canDraw) {
    // do your painting here

    canDraw = false;
}

base.OnPaint(e); // make sure you defer to the base painting method too

第二个选项有效地延迟了你的绘画,直到你说它没关系..但只有你的自定义绘画。您将base.OnPaint调用退出条件,以便始终可以在需要时进行绘制。